uva 10465 Homer Simpson
2015-07-01 13:39
302 查看
题目大意:
辛普森喜欢吃汉堡,他可以用m分钟吃完一个“小丑汉堡”,结果旁边的商场又开了一家汉堡店,他也非常喜欢吃新开的这家店的“ Kwik汉堡”,吃一个“ Kwik汉堡”要n分钟。现在给你t分钟,问你在尽量把所有时间都用再吃汉堡上且全部吃完能吃多少个?如果实在吃不完他可以用剩余的时间喝啤酒,此时输出最多能吃多少,且输出喝啤酒的时间。(思路见代码下方)
送两组数据:
165 986 988
2 6598 56
12 6 89
21 489 98
答案:
1 2
28
14 5
4 14
思路:
其实这题可以用同余方程来解决,但是用dp的方法练练思想也不错。就是一个完全背包问题,并且要求恰好装满这个背包。而且不但要求你输出可以装多少个,而且还要求你如果无法装满要求的t容量的背包的话输出不装满情况下的最多能吃多少个。用两个数组记录,dp用来记录最多能装多少,tot用来记录花了多长时间,如果最后输出的dp[t]是负数表示无法装满这个t容量的背包,此时向前寻找第一个非负数,然后输出对应的t-tot[index]表示喝啤酒的时间。
因为背包里物品的东西很少,只有两个,所以可以优化循环过程。就是在枚举容量的时候不用j++,而是j+=gcd(a[0],a[1])。优化后速度能快上0.1秒左右。(原来是0.3几)
优化后的代码
辛普森喜欢吃汉堡,他可以用m分钟吃完一个“小丑汉堡”,结果旁边的商场又开了一家汉堡店,他也非常喜欢吃新开的这家店的“ Kwik汉堡”,吃一个“ Kwik汉堡”要n分钟。现在给你t分钟,问你在尽量把所有时间都用再吃汉堡上且全部吃完能吃多少个?如果实在吃不完他可以用剩余的时间喝啤酒,此时输出最多能吃多少,且输出喝啤酒的时间。(思路见代码下方)
送两组数据:
165 986 988
2 6598 56
12 6 89
21 489 98
答案:
1 2
28
14 5
4 14
[code]#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<string> #include<cmath> #include <iomanip> using namespace std; const int minint=-9999999; int dp[10001],tot[10001]; int a[2]; int max(int x,int y) { if(x>y) return x; return y; } int main() { ios::sync_with_stdio(false); int n,t,index,ans; while(cin>>a[0]>>a[1]>>t) { if(t<min(a[0],a[1])) { cout<<0<<" "<<t<<endl; continue; } ans=minint; for(int i=1;i<=t;i++) { tot[i]=minint; dp[i]=minint; } tot[0]=dp[0]=0; for(int i=0;i<2;i++) { for(int j=a[i];j<=t;j++) { tot[j]=max(tot[j-a[i]]+a[i],tot[j]); dp[j]=max(dp[j-a[i]]+1,dp[j]); } } if(dp[t]>0) cout<<dp[t]<<endl; else { index=t; while(dp[index]<0) index--; cout<<dp[index]<<" "<<t-tot[index]<<endl; } } return 0; }
思路:
其实这题可以用同余方程来解决,但是用dp的方法练练思想也不错。就是一个完全背包问题,并且要求恰好装满这个背包。而且不但要求你输出可以装多少个,而且还要求你如果无法装满要求的t容量的背包的话输出不装满情况下的最多能吃多少个。用两个数组记录,dp用来记录最多能装多少,tot用来记录花了多长时间,如果最后输出的dp[t]是负数表示无法装满这个t容量的背包,此时向前寻找第一个非负数,然后输出对应的t-tot[index]表示喝啤酒的时间。
因为背包里物品的东西很少,只有两个,所以可以优化循环过程。就是在枚举容量的时候不用j++,而是j+=gcd(a[0],a[1])。优化后速度能快上0.1秒左右。(原来是0.3几)
优化后的代码
[code]#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<cstring> #include<string> #include<cmath> #include <iomanip> using namespace std; const int minint=-9999999; int dp[10001],tot[10001]; int a[2]; int max(int x,int y) { if(x>y) return x; return y; } int gcd( int a,int b) { if(b==0) return a; return gcd(b,a%b); } int main() { ios::sync_with_stdio(false); int n,t,index,ans; while(cin>>a[0]>>a[1]>>t) { if(t<min(a[0],a[1])) { cout<<0<<" "<<t<<endl; continue; } ans=minint; for(int i=1;i<=t;i++) { tot[i]=minint; dp[i]=minint; } tot[0]=dp[0]=0; n=gcd(a[0],a[1]); for(int i=0;i<2;i++) { for(int j=a[i];j<=t;j+=n) { tot[j]=max(tot[j-a[i]]+a[i],tot[j]); dp[j]=max(dp[j-a[i]]+1,dp[j]); } } if(dp[t]>0) cout<<dp[t]<<endl; else { index=t; while(dp[index]<0) index--; cout<<dp[index]<<" "<<t-tot[index]<<endl; } } return 0; }
相关文章推荐
- YTU 2845: 编程题AB-卡片游戏 dfsA
- 零基础学习hadoop
- 解决centos安装 sda必须有一个GPT磁盘标签
- Android 百分比布局库(percent-support-lib) 解析与扩展
- java 检测一个URL地址是否有效
- Akka FSM 源代码分析
- uboot的udp发送
- 8天学通MongoDB——第五天 主从复制
- Android xxx is not translated in zh解决办法
- 多态
- 在python正在使用mysql
- JS 键值对
- 安卓查看当前网络的ip
- 安装php扩展后,执行时找不到扩展 class xxx no found
- 各语言技术列表
- 【Java基础学习笔记】输入输出流之Reader
- rich:pickList标签的使用
- ios json数据解析
- Assert()
- Windows Server 2012部署Enterprise Solution 5.4