历年试题——买不到的数目

问题描述

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式

两个正整数,表示每种包装中糖的颗数(都不多于1000)

输出格式

一个正整数,表示最大不能买到的糖数

样例输入1

4 7

样例输出1

17

样例输入2

3 5

样例输出2

7
 
//买不到的数目 自己理解后打出来的 
 //利用输入a b 循环相乘又不能超过n(我们定义的比较大的数)
 //然后用数组标记可以买到的数 标记为1 不能买默认都是0 
 //最后遍历数组 如果有连续的a 是可以买到的 那 减去a最近的不能买到 标记为
 //0的那个数值就是 最大买不到数目  其中a要保证是小的那个输入数就行了 
 /*
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
long long n=100000;

int d,x;

int cha(int a[])
{
    int sum=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]==1)
        {
            sum++;
            if(sum>=x) return i-x;//如果连续都可以买到 那减去x就是不能买的数目 
        }
        else
        {
            sum=0;
        }
    }
    return -1;
}


void f(int a,int b)
{
    int c[n];
    for(int i=0;i<n/a;i++)  //为了确保后面的乘a b 不会溢出 
    for(int j=0;j<(n-i*a)/b;j++)
    {
        if(i*a+b*j < n) c[i*a+j*b] =1;//表示可以找到糖果 
        
    }
    
    cout << cha(c);

} 

int main()
{
    cin >> x >> d;
    if(x>d)
    {
        int t=x;
        x=d;
        d=t;
    }
    f(x,d);
    
} 
实现代码

 

posted @ 2017-09-01 23:51  kent鹏  阅读(1210)  评论(0编辑  收藏  举报