首先分析样例——
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
原先有10000(m)元,有7(n)项活动。
可以在1-4内完成zl[1].t,否则扣钱70元zl[1].v;有4个座位
可以在1-2内完成zl[2].t,否则扣钱60元zl[2].v;有2个座位
可以在1-4内完成zl[3].t,否则扣钱50元zl[3].v;有4个座位
可以在1-3内完成zl[1].t,否则扣钱70元zl[1].v;有3个座位
可以在1-1内完成zl[2].t,否则扣钱60元zl[2].v;有1个座位
可以在1-4内完成zl[3].t,否则扣钱50元zl[3].v;有4个座位
可以在1-6内完成zl[3].t,否则扣钱50元zl[3].v;有6个座位
要想得到更多钱,就要少扣钱,等于把扣钱多的游戏玩了在玩扣钱少的。
所以贪心策略如下:
从多到少——————
如果规定时间允许就贪。
先把第1个最贵的做了,把第四个座位占了。(肯定越后面的越好啊,就不会影响前面的座位,只影响后面的座位。)所以凡是能占第四个座位的,都会少一个的座位。座位数就变成了
(第1个游戏玩了,2 4-1 3 1 4-1 6-1——2,3,3,1,3,5);
以此类推……(如果时间<0,就在扣钱总数中加上相应扣钱数)
he+=zl[i].v;
本人为了学习信息学奥赛,因为时间关系就不陈述了。
说不清了,粘代码!!!
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,m,he,we; struct c{ //结构体 int t,v; }zl[501]; bool cmp(c a,c b) //sort函数按金钱大小来排(money!!!) { return a.v>b.v; } int main() { scanf("%d%d",&m,&n); for (int i=1;i<=n;i++) scanf("%d",&zl[i].t); //规定时间 for (int i=1;i<=n;i++) { scanf("%d",&zl[i].v); //扣钱!! } sort(zl+1,zl+n+1,cmp); for (int i=1;i<=n;i++) { if(zl[i].t>0) //如果有时间完成,就完成。 { for(int j=i+1;j<=n;j++) //完成后,所有能站此座位的的,都少了一座位,就-1。(多理解一下)。 if(zl[i].t<=zl[j].t) zl[j].t--; } else //没时间,就代表必须扣相应的钱了。 he+=zl[i].v; } printf("%d",m-he); return 0; }
勿喷!!!!!!!!!!!qaq,,逃
原文:https://www.cnblogs.com/mzyczly/p/10702418.html