Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10043 Accepted Submission(s): 5875
3 3 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
0 3 5
好吧这题我只知道要根据分数排序,写完bool cmp后sort就不知道咋办了。弱比的我还是得百度。
做法:首先根据分数降序排序,其次若分数相同,则天数少的排前面(升序)。然后再创建一个记录int数组,由于是贪心问题,尽量将要求第几天完成的排在那一天,给前面腾出空间若那一天被占用了,则往前找空的一天,原则就是尽量往后排,尽量拖延,能迟点完成就迟点完成(尽量往后排)
代码:
#include<iostream> #include<algorithm> using namespace std; struct id { int day; int fenshu; }; bool cmp(const id a,const id b) { if(a.fenshu!=b.fenshu) return a.fenshu>b.fenshu;//先降序排分数 else return a.day<b.day;//再升序排截止日期 } int main(void) { int n,t,i,use[1009],j,sum,tem; cin>>t; while(t--) { memset(use,0,sizeof(use)); cin>>n; id *haha=new id[n+2];//new一下节省空间,n+2有安全感.... for (i=0; i<n; i++) cin>>haha[i].day; for (i=0; i<n; i++) cin>>haha[i].fenshu; sort(haha,haha+n,cmp);//排个序 sum=0; for (i=0; i<n; i++) { tem=haha[i].day;//这里比较重要,从某分数对应的天数开始往前找 while(tem) { if(use[tem]==0)//为0则没被占用 { use[tem]=1;//那现在就要占用了,标记为1 break;//果断break } else { tem--;//自己对应那天被占用则往前找(占用别人的) } } if(tem==0)//到0了还没找到,那就注定没时间补了 sum+=haha[i].fenshu;//扣下这分! } cout<<sum<<endl; delete []haha;//记得delete[] } return 0; }