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

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

输入:

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

输出:

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

样例输入:

4 7 

样例输出:

17

思路:
三种思路(看看你能想到哪几个,我一开始是一个都不会的,智商不够QAQ)
1.暴力
就是在大的数起点开始依次累加两个数,同时标记,最后在最大的标记-1即得到了我们的最大解

#include<bits/stdc++.h>
using namespace std;
int main()
{
	 int m,n,imax,i;
	 int a[101000]={0};
	 cin>>m>>n;
	 a[m]=a[n]=1;
	 if(m>n)
	 {
	 	 i=m;
		  m=n;
		  n=i;
	 }
	 for(i=m;i<100000;i++)
 	{
  		if(a[i]==1)
 			 a[i+m]=a[i+n]=1;
 		else
 			 imax=i;
 	}
	 cout<<imax<<endl;
	 return 0;
 }

2.万物皆dp-动态规划
和暴力法的思想其实也大差不差,就是dp[i]=dp[i-n] || dp[i-m] 标记1,最后往前找,找到没有标记的点就是最大解

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1000005;
int dp[maxn];
 
int main() {
	int n, m;
	cin>>n>>m;
	memset(dp, 0, sizeof(dp));
	dp[n] = 1, dp[m] = 1;
	int t = max(n, m);
	for(int i = t + 1; i < maxn; i++) {
		if(dp[i - n] || dp[i - m]) dp[i] = 1;
	}
		
	for(int i = maxn - 1; i >= 0; i--) {
		if(!dp[i]) {
			printf("%d\n", i);
			break;
		}
	}
	return 0;
}

3.找规律 这个比较考验数学能力和智商了,我肯定是找不到的,答案也是参考别人
最大不能组合出的数目为x*y-x-y

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int x, y;
    cin >> x >> y;
    if (x % 2 == 0 && y % 2 == 0)
    cout << 999999;
    else
    cout << x * y - x - y;
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Esaka7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值