training@USC 12 2
CJ的任务
Time Limit:1000ms Memery Limit:32768K
Accepted/Submit(Users): 2/5(40.0%)
Description
CJ无所事事一段时间后,突然接到了Boss的任务。这次Boss一次性给他安排了n个任务(1<=n<100000),要求在m天内完成(m<1000000)。CJ这下得忙坏了,接到任务的第1天他就开始工作了!CJ知道每个任务的最迟开始时间为第d天,价值为v(d,v为整数,d<1000000, v<100),每个任务都可以都需要1天才能完成。现在CJ困惑了,怎样才能使价值最大,他找到了学计算机的你。
Input
包含多组数据。 每组数据第一行为n,m; 接下来n行为d,v。
Output
输出任务所有任务价值和的最大值。
Sample Input
4 2 2 1 2 2 4 3 1 4
Sample Output
7
。。。首先条件反射觉得是DP。。。
结果一看数据,就无语了。。。
原来是贪心啊贪心。。。
先对所有的任务的价值进行排序(从大到小)
然后从按序从每个任务的最大限定时间开始,找到有空余的天,如果有,将价值加入总值sum并将该时间进行标记。。
如果一直找到天为0,则说明此任务不能完成;
这里主要的优化(否则会超时)是:已经找过了的天,就不需要再找一遍,直接用fa[]数组记下来。。。
那么下一次,就会跳过已经找过的,确定没有空闲的天;
贪心啊贪心。。。现在发现好像在数据量非常大的题目里,不是贪心,就是二分。。。
代码:
View Code
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 int flag[1000005]; 7 struct node{ 8 int a; 9 int v; 10 }; 11 node p[1000005]; 12 int fa[1000005]; 13 bool cmp(const node & b,const node & c){ 14 return b.v>c.v; 15 } 16 int sea(int start){ 17 if(start==0) 18 return -1; 19 if(flag[start]==0){ 20 return start; 21 } 22 // cout<<start<<endl; 23 int tem=fa[start]; 24 fa[start]=fa[fa[start]]; 25 return sea(tem); 26 } 27 int main(){ 28 int n,m; 29 while(scanf("%d%d",&n,&m)!=EOF){ 30 memset(flag,0,sizeof(flag)); 31 // memset(flag2,0,sizeof(flag2)); 32 int sum=0; 33 for(int i=0;i<n;i++){ 34 scanf("%d%d",&p[i].a,&p[i].v); 35 // flag[i]=0; 36 // flag2[i]=0; 37 // fa[i+1]=i; 38 } 39 for(int k=0;k<=1000000;k++){ 40 fa[k+1]=k; 41 } 42 sort(p,p+n,cmp); 43 for(int j=0;j<n;j++){ 44 int temp; 45 if(p[j].a>m){ 46 temp=sea(m); 47 } 48 else{ 49 temp=sea(p[j].a); 50 // cout<<p[j].a<<" "<<temp<<endl; 51 } 52 if(temp!=-1){ 53 sum+=p[j].v; 54 flag[temp]=1; 55 // fa[p[j].a]=temp; 56 } 57 // else{ 58 // flag2[temp]=1; 59 // } 60 } 61 printf("%d\n",sum); 62 // cout<<sum<<endl; 63 } 64 return 0; 65 }
榜单
Time Limit:1000ms Memery Limit:32768K
Accepted/Submit(Users): 1/2(50.0%)
Description
ZZY很喜欢流行音乐,每周都要跟踪世界各地各种榜单,例如Oricon和Billboard,现在给出每周各个单曲的销量请给出每周的TOP5以及TOP5中各个单曲的浮动情况。 量的排名是按照本周销量排名,而不是总销量。 浮动情况则是较上周的排名变动,也就是说即使某单曲本周销量比上周的差,但排名比上周高,也是*UP*。反之若排名比上周低则为*DOWN*。若与上周的名次一样,则是*STAY*。 若是本周发行的新单(前面未有统计过销量),则浮动的情况为*NEW*。所以第一周所有单的情况都为*NEW*。
Input
多周数据,每周第一行输入为一个正整数N(5<=N<=10)表示当周统计了销量的专辑数,当N=0时结束输入。(不超过10周) 每周的单曲名字都是不超过30位的字符串(不会有空格,连续的串),名字后面跟的就是销量,单周最大销量不超过200万张。并且在不同周,相同的专辑名字一定是一模一样(相同的字符串)。 每周不会出现两个单曲销量相同。 本周没有统计前面某个已存在单曲的销量则说明本周其销量小得可以忽略,为0。
Output
第一组数据为第一周,第二组数据为第二周,以此类推。 每周数据第一行为WEEK k其中k为周数,WEEK k的左右两边各16个'-'。 紧接着五行,依次为top1~top5。 先输出当前是第几名"rank.",再接着当前名次单曲较上周的浮动情况。 *DOWN*与*STAY*后面空两格格输出单曲名,*NEW*后面空三格输出单曲名,*UP*后面空四格输出单曲名。 每行输出完单曲名后不要输出多余空格。 具体输出格式细节参考样例。
Sample Input
6 AKB48-Give_me_Five 1200000 Adele-Set_Fire_To_The_Rain 900000 Katy_Perry-Part_Of_Me 400000 KANA-Sakura,I_love_you 360000 Nicki_Minaj-Starships 300000 AAA-SAILING 350000 5 KAT_TUN-CHAIN 550000 Adele-Set_Fire_To_The_Rain 850000 AKB48-Give_me_Five 500000 KANA-Sakura,I_love_you 300000 Nicki_Minaj-Starships 290000 0
Sample Output
----------------WEEK 1---------------- 1.*NEW* AKB48-Give_me_Five 2.*NEW* Adele-Set_Fire_To_The_Rain 3.*NEW* Katy_Perry-Part_Of_Me 4.*NEW* KANA-Sakura,I_love_you 5.*NEW* AAA-SAILING ----------------WEEK 2---------------- 1.*UP* Adele-Set_Fire_To_The_Rain 2.*NEW* KAT_TUN-CHAIN 3.*DOWN* AKB48-Give_me_Five 4.*STAY* KANA-Sakura,I_love_you 5.*UP* Nicki_Minaj-Starships
Source
ZZY@USC
这就是一道很简单的模拟题;不过因为题意一开始没弄清,有一个地方搞错啦,所以后来改晕了。。
幸好和汪老大讨论了一下,真实一语点醒梦中人啊。。。
再一改就AC了。。。
结论:做题之前审题是非常重要的~尤其是模拟题。。。如果改得太晕,不如和队友讨论讨论,肯定比自己一个人苦想强。。。
代码:
View Code
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<map> 6 using namespace std; 7 struct node{ 8 char name[100]; 9 int num; 10 int flag; 11 }; 12 node a[100]; 13 node b[100]; 14 bool cmp(const node & c,const node & d){ 15 return c.num>d.num; 16 } 17 int main(){ 18 int n; 19 int times=0; 20 char top[100][20]; 21 int m=0; 22 map<string,int> mapp; 23 while(cin>>n){ 24 memset(a,0,sizeof(a)); 25 if(n==0) 26 break; 27 m++; 28 for(int i=0;i<n;i++){ 29 scanf("%s%d",a[i].name,&a[i].num); 30 // mapp[a[i].name]=1; 31 } 32 sort(a,a+n,cmp); 33 for(int j=0;j<5;j++){ 34 int k; 35 for(k=0;k<times;k++){ 36 if(strcmp(a[j].name,b[k].name)==0){ 37 if(j<b[k].num){ 38 strcpy(top[j],"*UP* "); 39 // top[j]="*UP* "; 40 } 41 else if(j==b[k].num){ 42 strcpy(top[j],"*STAY* "); 43 // top[j]="*STAY* "; 44 } 45 else if(j>b[k].num){ 46 strcpy(top[j],"*DOWN* "); 47 // top[j]="*DOWN* "; 48 } 49 break; 50 } 51 } 52 if(k>=times){ 53 if(mapp[a[j].name]==1){ 54 strcpy(top[j],"*UP* "); 55 } 56 else 57 strcpy(top[j],"*NEW* "); 58 // top[j]="*NEW* "; 59 } 60 } 61 cout<<"----------------WEEK "<<m<<"----------------"<<endl; 62 for(int g=0;g<=4;g++){ 63 printf("%d.%s%s\n",(g+1),top[g],a[g].name); 64 } 65 for(int i=0;i<n;i++){ 66 mapp[a[i].name]=1; 67 b[i].num=i; 68 strcpy(b[i].name,a[i].name); 69 } 70 // sort(b,b+times,cmp); 71 times=n; 72 } 73 return 0; 74 } 75

浙公网安备 33010602011771号