天梯赛补题

L2-003 月饼 (25 分)

感想:一定注意用double类型,毕竟样例代表不了题目中的样例类型

思路:开一个结构体进行排序,先按照单价进行排序就行

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 struct people{
 9     double n;
10     double money;
11     double mon;
12 }a[maxx];
13 bool cmp(people a,people b){
14     if(a.mon==b.mon){
15         return a.n>b.n;
16     }else{
17         return a.mon>b.mon;
18     }
19 }
20 int main(){
21     int n,m;
22     scanf("%d %d",&n,&m);
23     for(int i=0;i<n;i++){
24         scanf("%lf",&a[i].n);
25     }
26     for(int i=0;i<n;i++){
27         scanf("%lf",&a[i].money);
28         a[i].mon=a[i].money*1.0/a[i].n;
29     }
30     sort(a,a+n,cmp);
31     double summ=0,sum=0;
32     for(int i=0;i<n;i++){
33         if(sum+a[i].n>m){
34             summ+=a[i].mon*(m-sum);
35             break;
36         }else if(sum+a[i].n==m){
37             summ+=a[i].money;
38             break;
39         }else{
40             sum+=a[i].n;
41             summ+=a[i].money;
42         }
43     }
44     printf("%.2f\n",summ);
45 }
View Code

L2-009 抢红包 

感想:主要就是结构体排序问题

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 struct people{
 9     int num=0;//红包数
10     double money=0;
11     int i;
12 }a[maxx];
13 bool cmp(people a,people b){
14     if(a.money==b.money){
15         if(a.num==b.num){
16             return a.i<b.i;
17         }
18         return a.num>b.num;
19     }
20     return a.money>b.money;
21 }
22 int main(){
23     int n;
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++){
26         a[i].i=i;
27     }
28     for(int i=1;i<=n;i++){
29         int m;
30         double sum=0;
31         scanf("%d",&m);
32         for(int j=1;j<=m;j++){
33             int num;
34             double money;
35             scanf("%d %lf",&num,&money);
36             sum+=money;//计算这个人发出去多少钱
37             a[num].money+=money;
38             a[num].num++;
39 
40         }
41         a[i].money-=sum;
42 
43     }
44     /*printf("\n");
45     for(int i=1;i<=n;i++){
46         printf("%d %.2f\n",a[i].i,a[i].money*0.01);
47     }
48     printf("\n");*/
49     sort(a+1,a+n+1,cmp);
50     for(int i=1;i<=n;i++){
51         printf("%d %.2f\n",a[i].i,a[i].money*0.01);
52     }
53 }
View Code

L2-010 排座位

感想:判断条件的位置上应该是:是不是相乘为1,并不是分别为1

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 int main(){
 9     int n,m,k;
10     scanf("%d %d %d",&n,&m,&k);
11     //n.宾客编号  m.宾客之间的关系条数  k.查询的条数
12     int a[200][200];
13     for(int i=0;i<200;i++){
14         for(int j=0;j<200;j++){
15             a[i][j]=0;
16         }
17     }
18     for(int i=0;i<m;i++){
19         int x,y;
20         int rela;
21         scanf("%d %d %d",&x,&y,&rela);
22         a[x][y]=rela;
23         a[y][x]=rela;
24     }
25     while(k--){
26         int x,y;
27         scanf("%d %d",&x,&y);//1朋友  -1死对头  朋友的朋友也是朋友
28         if(a[x][y]==1){
29             printf("No problem\n");
30         }else{
31             int flag=0;
32             for(int i=1;i<=n;i++){
33                 if(a[x][i]*a[y][i]==1){//此处应该是相乘为1
34                     flag=1;
35                 }
36             }
37             if(flag==0&&a[x][y]==0){
38                 printf("OK\n");
39             }else if(flag==1&&a[x][y]!=-1){
40                 printf("No problem\n");
41             }else if(a[x][y]==-1&&flag==1){//有敌对也有共同的朋友
42                 printf("OK but...\n");
43             }else if(a[x][y]==-1&&flag==0){
44                 printf("No way\n");
45             }
46         }
47 
48     }
49 
50 }
View Code

 

posted @ 2021-04-27 15:30  bonel  阅读(32)  评论(0编辑  收藏  举报