4 4 4 8 1 6 6 2 4 8 2 2 12 4 0 1 2 3 4 2 8 10 1 8 11 2 8 12 3 8 13 4 0 3
1:3 1:1 2:1 1:2 1:1 1:1
啊好坑了,折腾了将近一个小时。题意是从选出的那几个国家中排序,不是全部排序!!!!!
我觉得这道题不需要sort快排,有多少人比它大,它的名次就往后退多少就行啦。
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { float g1,g2,rate1,rate2; //double过不去,又一个坑! int rg1,rg2,rg3,rg4; //4种排序的排名 }data[1000]; int main() { int n,m; int rate[1000]; //需要排名的国家 while (~scanf ("%d %d",&n,&m)) { memset (data,0,sizeof (data)); for (int i = 0 ; i < n ; i++) { float t; scanf ("%f %f %f",&data[i].g1,&data[i].g2,&t); data[i].rate1 = data[i].g1 / t; data[i].rate2 = data[i].g2 / t; data[i].rg1 = data[i].rg2 = data[i].rg3 = data[i].rg4 = 1; } for (int i = 0 ; i < m ; i++) scanf ("%d",&rate[i]); for (int i = 0 ; i < m ; i++) { for (int j = 0 ; j < m ; j++) //啊啊啊啊坑坑坑死了,原来是在选中的那群国家中排序,WA了10次 { if (data[rate[i]].g1 < data[rate[j]].g1) data[i].rg1++; if (data[rate[i]].g2 < data[rate[j]].g2) data[i].rg2++; if (data[rate[i]].rate1 < data[rate[j]].rate1) data[i].rg3++; if (data[rate[i]].rate2 < data[rate[j]].rate2) data[i].rg4++; } if (data[i].rg1 <= data[i].rg2 && data[i].rg1 <= data[i].rg3 && data[i].rg1 <= data[i].rg4) printf ("%d:1\n",data[i].rg1); else if (data[i].rg2 <= data[i].rg1 && data[i].rg2 <= data[i].rg3 && data[i].rg2 <= data[i].rg4) printf ("%d:2\n",data[i].rg2); else if (data[i].rg3 <= data[i].rg1 && data[i].rg3 <= data[i].rg2 && data[i].rg3 <= data[i].rg4) printf ("%d:3\n",data[i].rg3); else printf ("%d:4\n",data[i].rg4); } printf ("\n"); } return 0; }