poj 2153 map && sort+二分
2012-08-23 22:57
316 查看
题意:有N个人,然后有M次考试,每次考试每个人都会有一个分数,然后求每次考试后“Li Ming” 的排名。
思路:开始以为就是个sort的排序,后来WA了,原来有trick,排名是按总分来排序的,所以每次考试都要累加得分,但是每个人每次考试的得分如何累加到这个人的得分上,直接暴力TLE...还得用二分啊。。。。
还有就是用map做。。。
思路:开始以为就是个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"); }
相关文章推荐
- POJ—2153(STL<map>)
- POJ 2153 排名次 水题map
- ACM: 二分题 poj 3497
- poj Babelfish(二分||map)
- POJ 2153 Rank List map
- POJ 2503 Babelfish [map & string]
- 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)
- poj 2549 Sumsets 【二分&&模拟】
- ACM: 一题STL map题 poj 1002 (bt…
- poj Babelfish(二分||map)
- 【贪心专题】POJ 2456 Aggressive cows && NYOJ 586 疯牛(最大化最小值 贪心+二分搜索)
- POJ 2503 Babelfish 字典树经典题 三种方法 (map,排序+二分,字典树)
- POJ 3233 矩阵快速幂&二分
- POJ-1318(list.sort()输出不为字典序,map才是按字典序排列)
- poj Babelfish(二分||map)
- 【最大流+Dinic+Edmonds_Karp+二分匹配】北大 poj 1698 Alice's Chance
- map的基本应用--hdu--1004&&poj--2643
- poj 1904 King's Quest 二分图中强联通分量的运用
- POJ 3233 矩阵快速幂&二分
- poj 3320 Jessica's Reading Problem 【尺取法+STLmap set】