[蓝桥杯][2013年第四届真题]买不到的数目

    技术2022-07-15  49

    题目描述 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。 你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。 本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。 输入 两个正整数,表示每种包装中糖的颗数(都不多于1000) 输出 一个正整数,表示最大不能买到的糖数 样例输入 4 7 样例输出 17

    PS:思维题真的不会做好不好……

    法一:观察题目,其实可以把题目抽象成:有两个正整数a、b,可以组成任意线性组合ax+by,x、y非负,求最大不能组合数。 做这道题有一个结论可以直接用:两个互质数a、b的最大不能组合数为ab-a-b。 两个互质的数,不能组合出的最大整数是a*(b-1)-b,不能组合出的整数的个数数(a-1)*(b-1)/2

    #include <bits/stdc++.h> using namespace std; int main(){ int a,b; cin>>a>>b; cout<<a*b-a-b<<endl; return 0; }

    这结论也不知道啊,找规律找一下午也不一定找出来 ̄へ ̄

    法二:这个最大不能组合数一定是不会超过ab的,把ab内所有可能的解枚举出来,然后从后往前找不能被组合出来的数,那么第一个找到的数就是最大不能组合数。

    以下为摘抄

    #include<iostream> #include <set> using namespace std; int main(){ set<int> s; set<int>::iterator it; int a,b; cin>>a>>b; for(int x = 0;a*x<=a*b;x++) //枚举a*b以内的所有解 for(int y = 0;a*x+b*y<=a*b;y++) s.insert(a*x+b*y); for(int i = a*b; i>=0; i--){ if(s.find(i)==s.end()) { //i不在set中,那么i就是答案 cout<<i<<endl; break; //找到后跳出循环 } } return 0; }
    Processed: 0.020, SQL: 9