天梯赛补题
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 }
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 }
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 }