二零一零年第3题
2010年第3题
题目地址:http://jobdu.sinaapp.com/problem.php?pid=1007
提供一个测试样例
8 6
4 8 1
6 6 2
4 8 2
2 12 4
7 12 9
2 22 6
3 22 5
9 10 1
0 1 2 4 6 7
实际排序国家以及每次排序结果
4 8 1 4 4 2 2 2:3
6 6 2 3 6 3 5 3:1
4 8 2 4 4 4 4 4:1
7 12 9 2 2 5 6 2:1
3 22 5 6 1 6 3 1:2
9 10 1 1 3 1 1 1:1
C语言源码:
#include<stdio.h> #include<stdlib.h> #define maxsize 100000 typedef struct ran { int a,b; double c,d; int num; int ra; }ran; ran r[maxsize]; typedef struct country { int a,b,c; int rank[5]; }country; country c[maxsize]; int cmp1(const void *a,const void *b) { ran *aa=(ran *)a; ran *bb=(ran *)b; return bb->a-aa->a; } int cmp2(const void *a,const void *b) { ran *aa=(ran *)a; ran *bb=(ran *)b; return bb->b-aa->b; } int cmp3(const void *a,const void *b) { ran *aa=(ran *)a; ran *bb=(ran *)b; return aa->c>bb->c?-1:1; } int cmp4(const void *a,const void *b) { ran *aa=(ran *)a; ran *bb=(ran *)b; return aa->d>bb->d?-1:1; } int main() { int n,m,i,stack[maxsize],j,y,l,min,k; double x; while(scanf("%d %d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%d %d %d",&c[i].a,&c[i].b,&c[i].c); for(i=0;i<m;i++) scanf("%d",&stack[i]); for(i=0;i<m;i++) { j=stack[i]; r[i].a=c[j].a; r[i].b=c[j].b; r[i].c=(double)c[j].a/c[j].c; r[i].d=(double)c[j].b/c[j].c; r[i].num=j; } for(k=1;k<=4;k++) { switch(k) { case 1:qsort(r,m,sizeof(r[0]),cmp1);break; case 2:qsort(r,m,sizeof(r[0]),cmp2);break; case 3:qsort(r,m,sizeof(r[0]),cmp3);break; default :qsort(r,m,sizeof(r[0]),cmp4);break; } if(k==1) { x=-1; for(i=0;i<m;i++) { if(r[i].a!=x) { r[i].ra=i+1; y=i+1; x=r[i].a; } else r[i].ra=y; } for(i=0;i<m;i++) c[r[i].num].rank[1]=r[i].ra; } if(k==2) { x=-1; for(i=0;i<m;i++) { if(r[i].b!=x) { r[i].ra=i+1; y=i+1; x=r[i].b; } else r[i].ra=y; } for(i=0;i<m;i++) c[r[i].num].rank[2]=r[i].ra; } if(k==3) { x=-1; for(i=0;i<m;i++) { if(r[i].c!=x) { r[i].ra=i+1; y=i+1; x=r[i].c; } else r[i].ra=y; } for(i=0;i<m;i++) c[r[i].num].rank[3]=r[i].ra; } if(k==4) { x=-1; for(i=0;i<m;i++) { if(r[i].d!=x) { r[i].ra=i+1; y=i+1; x=r[i].d; } else r[i].ra=y; } for(i=0;i<m;i++) c[r[i].num].rank[4]=r[i].ra; } } for(i=0;i<m;i++) { j=stack[i]; min=1; for(l=1;l<=4;l++) if(c[j].rank[l]<c[j].rank[min]) min=l; printf("%d:%d\n",c[j].rank[min],min); } printf("\n"); } }