ZCMU—1587
2016-12-27 20:04
190 查看
1587: 做功课
Time Limit: 1 Sec Memory Limit: 128 MB[Submit][Status][Web
Board]
Description
伊格内修斯刚刚参加完ACM/ ICPC比赛回来。现在,他有很多功课要做。每一位老师给他规定了功课提交的最后期限。如果伊格内修斯的在截止日期后的递交作业,老师会减少他的最终测试得分。现在我们假设他每天都在做功
课。每门功课总是需要一天时间。现在,伊格请你帮他安排做功课,尽量减少降低分数的顺序。
Input
输入包含多个测试用例。输入的第一行是一个单一的整数t即测试用例的数目。每个测试用例开始一个正整数N(1<= N <= 1000),其表示一共有多少门作业作业。接着两行数据。
第一行包含N个整数,表明该科目的最后期限,而下一行包含N个整数,表明了降低分数。
Output
对于每一个例子,你需要输出最少的可能降低的分数,每个测试占一行Sample Input
33
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
Sample Output
03
5
【分析】
C++练习题.......害怕...咳咳不扯淡...简单dp,找出最大的能够完成的学分,然后总的学分减去这个最大学分就是最小的会被扣掉的学分
f[i]表示到第i天为止可以修到的最大学分,f[i]=max(f[i],f[i-1]+w[i]); 对每门课都需要一次遍历i=0~time[i]
(如果用正常的二维数组表示的话就不需要倒过来...至于为什么要倒过来~因为把二维压成一维,那么f[i]只会影响f[j] (j>i),具体的还是去看一看经典01背包二维压成一维的原因吧~同理)
二维的话就是f[i][j]前i门课,到第j天能修到的最大学分
【代码】
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; struct xx{ int time,score; }a[2000]; int cmp(xx x,xx y) { if (x.time!=y.time) return x.time<y.time; return x.score>y.score; } int f[100000]; int main() { int pp;scanf("%d",&pp); while (pp--) { memset(f,0,sizeof(f)); int n;scanf("%d",&n); int ans=0; for (int i=0;i<n;i++) scanf("%d",&a[i].time); for (int i=0;i<n;i++) scanf("%d",&a[i].score),ans+=a[i].score; sort(a,a+n,cmp); for (int i=0;i<n;i++) for (int j=a[i].time;j>0;j--) f[j]=max(f[j],f[j-1]+a[i].score); int res=0; for (int i=0;i<=a[n-1].time;i++) res=max(res,f[i]); printf("%d\n",ans-res); } return 0; }
相关文章推荐
- ZCMU-1587-做功课
- ZCMU-1019: 分金币
- zcmu--1958: 机器翻译
- zcmu1507
- zcmu-1962
- ZCMU 1985:小C的数学问题(线段树+分治)
- ZCMUOJ2014: 一生之敌 2017浙江中医药校赛(usigned long long )
- Box UVA - 1587
- zcmu1032
- zcmu-2106
- 1587. Eat or Be Eaten
- NOJ[1587] 一群不学好的NBUT ACMers竟然作死要去爬山?晚上还困在山上回不去2333而且竟然只有一个手电筒,不是作死是什么
- Box UVa 1587
- UVA1587 BOX盒子
- uva 1587 Box(思路)
- ???习题3-10 UVa1587 Box
- HDOJ(HDU) 1587 Flowers(水、、)
- UVA-1587 Box
- zcmu 1617: 补提交
- zcmu 1075