您的位置:首页 > 其它

hdu 3789 请不要将所有国家排序

2012-06-14 10:10 274 查看
坑爹,考浙大的研究生果然都不是一般人……

#include "stdio.h"
#include "string.h"

#define M 100

int best[M];
int final[M];

int n, m;

int data[M][3];
int state[M];

void refresh(int* ini, int w){
int i;
for(i=0; i<n; i++)
if(final[i] > ini[i]){
final[i] = ini[i];
best[i] = w;
}
}

void order(double* seq, int w){
int i, j;
double t;
int tt;
int oo[M], ini[M];
for(i=0; i<m; i++)
oo[i] = state[i];   //初始化,oo与seq对应,oo[i]号国家的成绩是seq[i]

for(i=1; i<m; i++){
t = seq[i];
tt = oo[i];
for(j=i-1; j>=0; j--){
if(seq[j] < t){
seq[j+1] = seq[j];
oo[j+1] = oo[j];  //oo数组随着seq排序改变,始终与成绩的位置对应
}else
break;
}
seq[j+1] = t;
oo[j+1] = tt;
}

for(i=0; i<m; i++){
if(i>=1 && seq[i] ==seq[i-1])
ini[oo[i]] = ini[oo[i-1]];  //颠倒。oo[i] = k 表示第i名的国家是k,反转后为 ini[k] = i 表示k国家是第i名
else
ini[oo[i]] = i;
}

refresh(ini, w);
}

void main(){
int i;
double seq[M];

freopen("in.txt", "r", stdin);

while(scanf("%d %d", &n, &m)!=EOF){
for(i=0; i<n; i++){
scanf("%d %d %d", &data[i][0], &data[i][1], &data[i][2]);
}
for(i=0; i<m; i++)
scanf("%d", state+i);

memset(final, 0x7F, sizeof(final));

for(i=0; i<m; i++) seq[i] = data[state[i]][0];
order(seq, 1);
for(i=0; i<m; i++) seq[i] = data[state[i]][1];
order(seq, 2);
for(i=0; i<m; i++) seq[i] = (data[state[i]][0]*1.0)/data[state[i]][2];
order(seq, 3);
for(i=0; i<m; i++) seq[i] = (data[state[i]][1]*1.0)/data[state[i]][2];
order(seq, 4);

for(i=0; i<m; i++){
printf("%d:%d\n", final[state[i]]+1, best[state[i]]);
}
printf("\n");
}
}


只将给定国家号的国家排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: