2013-11-09 实验之买不到的糖果数目(递推思维+思维逻辑题)
2013-11-09 16:04
232 查看
题目:标题:买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
不需要考虑无解的情况
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms
思想:递推法,找到最后一个不能表示的数,先依次找到前面的不能表示数,组成队列,然后依次递推,即加上表示的数的最大值,计算能表示的数至不能表示数+最大值的数,是不是都能表示数队列中可以表示,若都可表示,程序结束,否则再抽取[b]不能表示数队列的最大数,再递推,重复上述操作。[/b]
注意事项:unsinged char 最大值为255,超过,就溢出;程序再选取极不合理值,会无法表示,比如6,8或6, 9等组合,我知道总能找到一个数不能表示,所以程序会溢出。
程序实现:
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
不需要考虑无解的情况
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms
思想:递推法,找到最后一个不能表示的数,先依次找到前面的不能表示数,组成队列,然后依次递推,即加上表示的数的最大值,计算能表示的数至不能表示数+最大值的数,是不是都能表示数队列中可以表示,若都可表示,程序结束,否则再抽取[b]不能表示数队列的最大数,再递推,重复上述操作。[/b]
注意事项:unsinged char 最大值为255,超过,就溢出;程序再选取极不合理值,会无法表示,比如6,8或6, 9等组合,我知道总能找到一个数不能表示,所以程序会溢出。
程序实现:
#include<stdlib.h> #include<stdio.h> unsigned int countLose = 0; unsigned int countWin= 0; unsigned int loseArray [4000]; unsigned int winArray [4000]; int num1, num2; int flag = 1; int cheack_in_win_array(unsigned int x) { unsigned int i; for(i = 0; i < countWin; i++){ if(winArray[i] == x){ return 1; } } return 0; } int cheack_in_lose_array(unsigned int x) { unsigned int i; for(i = 0; i < countLose; i++){ //printf("%d",loseArray[i] ); if(loseArray[i] == x){ //printf(" \nin lose %d\n",x); return 1; } } return 0; } void exec_check(unsigned int maxLose) { unsigned int i; unsigned int maxWin =0; //printf("\nvalue %d\n", maxLose); if(countWin > 0){ maxWin = winArray[countWin -1]; } //printf("last value %d\n", maxLose); //printf("last win %d\n", winArray[countWin -1]); //printf("last lose %d\n",loseArray[countLose - 1] ); for(i = maxWin + 1; i <= maxLose; i++){ if(cheack_in_win_array(i - num1) ||cheack_in_win_array(i -num2) ){ winArray[countWin++] = i; }else{ if(cheack_in_lose_array(i)==0){ loseArray[countLose++] = i; flag = 1; //printf("lose %d\n", i); } } } } void search_max_value() { unsigned int i; for(i = 1; i < num1; i++){ loseArray[countLose++] = i; } winArray[countWin++] = num1; for(i = num1+1; i < num2; i++){ if(i % num1 ){ loseArray[countLose++] = i; }else{ winArray[countWin++] = i; } } winArray[countWin++] = num2; while(flag > 0){ flag = 0; exec_check(loseArray[countLose -1] + num2); /*for(i = 0; i < countLose; i++){ printf("%d ", loseArray[i]); } printf("\n\n"); for(i = 0; i < countWin; i++){ printf("%d ", winArray[i]); } printf("\n\n"); printf("%d\n", x);*/ } printf("%d\n", loseArray[countLose -1]); } int main(void) { scanf("%d %d", &num1, &num2); if(num1 > num2){ unsigned int t = num2; num2 = num1; num1 = t; } if(num2 == num1 ){ printf("can not find\n"); return 1; } if(num2 == 1 || num1 == 1){ printf("all can translte\n"); return 1; } search_max_value(); return 0; }
相关文章推荐
- 2013-11-04 实验之取球游戏(递推思想,数学归纳思想,思维逻辑思想)
- 2013-10-30 实验之古堡算式(思维逻辑题)
- 蓝桥杯 买不到的数目(递推)
- 买不到的数目(小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。 小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗)
- 2013-11-03 实验之最大公共子串(思维逻辑题)
- 2013-11-07 实验之火柴游戏(递归思维逻辑,转化思维,查找最优解思维)
- 2013-11-02 实验之泊松分酒(思维逻辑题)
- 计算机程序的思维逻辑 (5) - 小数计算为什么会出错?
- 蓝桥杯练习系统历届试题 买不到的数目
- 计算机程序的思维逻辑(挺好的文章列表)
- 计算与推断思维 二、因果和实验
- 递推、规律思维题总结
- 计算机程序的思维逻辑 (31) - 剖析Arrays
- 计算机程序的思维逻辑 (1) - 数据和变量
- 计算机程序的思维逻辑 (8) - char的真正含义
- (24) 异常 (上) / 计算机程序的思维逻辑
- (28) 剖析包装类 (下) / 计算机程序的思维逻辑
- PHP学习随想之“思维逻辑”与“记忆”
- 2013-11-05 实验之密码发生器(正常逻辑题)
- 2013-11-08 实验之数独游戏(寻找所有解,局部简化思维,递归逻辑思维)