hdu1257
题目刚开始理解错了,该题可以同时有几个拦截系统并行的。题目不算难。
#include#include #include using namespace std;int main(){ int n; while(~scanf("%d",&n)) { int height; vector v; for(int i=0;i = height) { v[j] = height; break; } } if(j>=vsize) v.push_back(height); } printf("%d\n",v.size()); } return 0;}
hdu1789。
题意:t组测试数据,n个作业,每个作业需要一天完成,接下两行表示n个最后交作业时间,n个对应作业分数。
如果作业没有在最后时间提交,将会扣掉对应作业分数,求最小扣分数。
思路:声明ST st[n],其中st[i].d表示时间限制,st[i].s表示分数。先对数据st数组进行按作业分数从大到小sort。然后在申请一个temp数组,向里面填充数据。对st数组从0到n-1遍历,d=st[i].d,然后如果temp[d]不为0,则temp[d]=1;如果填充过(temp[d]==1) ,则d--循环填充,如果d==0,则表示该门课只能放弃了。
#include#include #include #include using namespace std;struct ST{ //d表示时间限制,s表示分数。 int d; int s;};bool Comp(ST s1,ST s2){ return s1.s > s2.s;}int main(){ int t;//测试组数 scanf("%d",&t); while(t--) { int n;//个数 scanf("%d",&n); ST st[n]; for(int i=0;i 0) { if(temp[d]==0) { temp[d] = 1; break; } --d; } if(d <= 0) res += st[i].s; } printf("%d\n",res); } return 0;}
hdu2111。
这道题目是典型的贪心问题,很简单。刚开始的时候看成了0,1背包,后来发现是单价,不是总价==。
#include#include #include #include using namespace std;struct ST{ int pi; //单价 int mi; //容量};bool comp(ST s1,ST s2){ return s1.pi > s2.pi;}int main(){ int v; while(~scanf("%d",&v),v) { int n; //v代表容量,n代表种类 scanf("%d",&n); ST st[n]; for(int i=0;i 0;++i) { if(v>=st[i].mi) { v -= st[i].mi; res += st[i].mi*st[i].pi; } else { res += v*st[i].pi; v = 0; } } printf("%d\n",res); } return 0;}
hdu4296,此题感觉题意有问题,不想说。
#include#include #include #include using namespace std;//求木块之上的重量和减去该木板的强度的最小值。struct ST{ int w; //重量 int s; //强度};bool Comp(ST s1,ST s2){ return s1.w + s1.s < s2.w + s2.s;}int main(){ int n; while(~scanf("%d",&n)) { ST st[n]; for(int i=0;i
hdu4864,题目挺难的,看了网上的解题思路才做出来的。是贪心加hash法,没有hash法容易超时。
题目是机器人n,任务数m,每个机器人只能做一个任务,机器人与任务都有x,y值,x表示时间,y表示等级。
只有当机器人的mac.x >= task.x 和 mac.y >= task.y都满足时,才表示该任务能被完成。完成任务后的收益是500*x + 2*y;求最大完成任务数与最大收益。
#include#include #include #include using namespace std;struct ST{ int x; //时间 int y; //等级 int getRes(){ return 500*x + 2*y;}};bool cmp(ST st1,ST st2){ if(st1.x != st2.x) return st1.x > st2.x; return st1.y > st2.y;}int main(){ int n,m; //机器人数,任务数 while(~scanf("%d%d",&n,&m)) { ST mac[n],task[m]; for(int i=0;i = task[i].x) ++Hash[mac[j++].y]; for(int k=task[i].y;k<=100;++k) { if(Hash[k]) { --Hash[k]; sum += task[i].getRes(); ++cnt; break; } } } printf("%d %I64d\n",cnt,sum); } return 0;}