CSU 1640 机智的刷题方式
2016-04-14 16:54
357 查看
1640: 机智的刷题方式
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 273 Solved: 92
[Submit][Status][Web
Board]
Description
小B想参加中南大学2015年大学生程序设计竞赛暑期集训,相信猛刷自然强的小B表示做题进集训队完全不是事~当然刷题还是有一定技巧的,考虑到每种题的分值不一样,难度不一样,小B要在上面做一些权衡。分数与题目对应关系如下:入门题 | 1分/题 |
基础题 | 2分/题 |
进阶题 | 5分/题 |
然后,小B想试着挑战一下自己的极限。已知他在接下来的时间里还有X的时间拿来刷题,那么他最多能刷到多少分?
Input
多组数据,第一行有一个整数T,表示有T组数据。(T<=100)以下每组数据第一行有三个整数A,B,C,表示小B做入门题、基础题和进阶题要花的时间的数量。(1<=A、B、C<=100)
然后第二行是2个整数H,X,分别表示小B还需要的分数和接下来小B拿来刷题的时间。(1<=H、X<=10000)
Output
每组数据输出两行,第一行输出小B刷够H分最少所需时间。第二行输出小B可能刷到的最高分数。
Sample Input
4 1 2 5 3 10 1 2 3 4 10 1 2 4 3 7 2 3 4 3 7
Sample Output
3 10 3 16 3 8 4 7
HINT
完全背包问题
题目里面有一个容易忽视的地方。
因为最后还要求完成H分数所需要的最短时间,那么完成H分数不一定是在X时间内完成的。也有可能在X之后的时间完成。DP数组要开大一些,才能容纳X之后,获得H分数之前的DP状态。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int MAXN=1000005; int dp[MAXN]; int main() { int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); int a,b,c; scanf("%d%d%d",&a,&b,&c); int h,x; scanf("%d%d",&h,&x); int ans=0; int score=0; for(int i=0;i<=x||ans==0;i++) { if(i>=a) dp[i]=max(dp[i],dp[i-a]+1); if(i>=b) dp[i]=max(dp[i],dp[i-b]+2); if(i>=c) dp[i]=max(dp[i],dp[i-c]+5); if(dp[i]>=h&&ans==0) ans=i; if(i<=x) score=max(dp[i],score); } printf("%d\n%d\n",ans,score); } return 0; }
相关文章推荐
- 正则表达式
- echo命令图文详解
- 余数和商 一位数乘一位数
- JSON 时间等常用转化的思路
- 什么是死锁及死锁的必要条件和解决方法【转】
- ThreadLocal类的用法
- hihocoder 1288
- 修改java类后,ireport无法立刻生效,解决办法
- 用闹钟运算
- 项目感想
- 一位数 * 一位数
- android开发中的九宫格布局的实现
- gulp自动刷新浏览器
- 十的阶乘
- Maven version management with Nexus
- 计算机相关专业同学如何做好职业规划,选择什么样的方向来发展?
- Volley的网络请求实例
- CAlayer层的属性
- 《MFC 笔记》 Part3 c++的格式.hpp
- 一个c++封装的zookeeper库