您的位置:首页 > 其它

poj 2153 map && sort+二分

2012-08-23 22:57 316 查看
题意:有N个人,然后有M次考试,每次考试每个人都会有一个分数,然后求每次考试后“Li Ming” 的排名。

思路:开始以为就是个sort的排序,后来WA了,原来有trick,排名是按总分来排序的,所以每次考试都要累加得分,但是每个人每次考试的得分如何累加到这个人的得分上,直接暴力TLE...还得用二分啊。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node {
int cnt;
int flag;
char s[35];
}p[10010] , p1[10010];
int cmp1(node a , node b) {
return strcmp(a.s , b.s) < 0;
}
int cmp2(node a , node b) {
if(a.cnt > b.cnt) return 1;
else if(a.cnt == b.cnt) {
if(a.flag < b.flag) return 1;
return 0;
}
return 0;
}
int Bin(int N , char s[]) {
int l , r , mid , ans;
l = 1 , r = N;
while(l <= r) {
mid = (l + r)>>1;
if(strcmp(p[mid].s , s)>=0) {
ans = mid;
r = mid - 1;
} else l = mid + 1;
//printf("xunhuan\n");
}
return ans;
}
int main() {
int N , M , i , cnt , j;
char ss[35];
while(~scanf("%d",&N)) {
getchar();
for(i = 1 ; i <= N ;i ++) {
//printf("i = %d\n",i);
gets(p[i].s);
if(strcmp(p[i].s , "Li Ming")==0) p[i].flag = 0;
else p[i].flag = 1;
}
sort(&p[1] , &p[N+1] , cmp1);
scanf("%d",&M);
//printf("M=%d\n",M);
getchar();
while(M--) {
for(i = 1 ; i <= N ; i ++) {
scanf("%d ",&cnt);
gets(ss);
int x = Bin(N , ss);
p[x].cnt += cnt;
}
//printf("yunxing\n");
for(i = 1 ; i <= N ; i ++) {
p1[i] = p[i];
}
sort(&p1[1] , &p1[N+1] , cmp2);

for(i = 1 ;i <= N ; i ++) {
//printf("%s\n",p[i].s);
if(strcmp(p1[i].s , "Li Ming")==0) {
printf("%d\n",i);
break;
}
}
}
}
}


还有就是用map做。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
int main() {
int n , m , i , j;
char s[35];
string name;
map<string , int> mp;//名字→分数
map<string , int>::iterator iter;
scanf("%d",&n);
getchar();
for(i = 1 ; i <= n ; i ++) {
gets(s);
name = s;
mp[name] = 0;//初始化0分
}
scanf("%d",&m);
int cnt;
for(i = 1 ; i <= m ; i ++) {
for(j = 1 ; j <= n ; j ++) {
scanf("%d ",&cnt);
gets(s);
name = s;
mp[name] += cnt;
}
iter = mp.find("Li Ming");
int score = iter->second;
int rank = 1;
for(iter = mp.begin() ; iter!=mp.end(); iter++) {
if(iter->second > score) rank++;
}
printf("%d\n",rank);
}
//system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: