ZOJ 3705 3706 3708 3710 3712 3713 3714(水题)
2013-05-12 13:45
441 查看
第一次参加省赛,能做的竟然都是水题,还是太弱了.
3705 给出一些计分规则,最后排序输出结果,表示这题严重歧视男性.
3706 把两个砝码任意一个分成两份,求最多能称量的重量总数,数据量很小,直接暴力枚举.
3708 给出一个图,求出边和点之间的比率,直接把重复边去掉,除一下就是结果了...
3710 给出一个朋友关系图,如果两个人拥有超过k个共同朋友,那么几天后他们就能成为朋友,求经过足够的时间后,最多能行成多少新的朋友关系,要注意的是直到不能再建立新朋友关系为止,直接暴力.
3712 基本上读懂题目已经就能做出来,因为连击是连续的,所以从50到300累加肯定是最大的得分,从300到50累加肯定是最小的得分,
3713 意思是把一行字符串的长度按照找7位一个字节输出,如果长度能够存在7位里,字节的最高位置0,否则只输出7位并且输出字节的最高位置1,直到全部输出长度.
要注意的是有空串要输出00,其他按照16进制输出就可以了,注意要补0.
3715 给出一行数字,求出最大的M个连续数字,首尾向连,开场3分钟不到就有4个过了.
3705 给出一些计分规则,最后排序输出结果,表示这题严重歧视男性.
#include <cstdio> #include <map> #include <memory.h> #include <functional> #include <algorithm> #include <iostream> using namespace std; const int maxn = 501; struct app{ char name[50]; double pts; bool operator<(const app & rhs)const{ return pts > rhs.pts ||(pts == rhs.pts && name < rhs.name); } }apps[maxn]; map<string, int> rank; map<int,int> probSet; bool isP[10000]; int japanJam[1001], N, M; void init(){ memset(isP + 2, 1, sizeof(isP)); for(int i = 2; i < 10000; ++i){ if(isP[i]) for(int j = 2; j * i < 10000; ++j){ isP[i * j] = 0; } } } int main(){ init(); int T; scanf("%d", &T); while(T--){ rank.clear(); probSet.clear(); memset(apps, 0, sizeof(apps)); scanf("%d %d", &N, &M); int MaoMaoN; scanf("%d", &MaoMaoN); for(int i = 0; i < MaoMaoN; ++i){ int t; scanf("%d", &t); probSet[t] = 1; } int OSCN; scanf("%d", &OSCN); for(int i = 0; i < OSCN; ++i){ int t; scanf("%d", &t); probSet[t] = 2; } int compN; scanf("%d", &compN); for(int i = 0; i < compN; ++i){ char name[50]; int r; scanf("%s %d", name, &r); rank[name] = r; } for(int i = 0; i < N; ++i){ char name[50], teamName[50], gender[50]; int proN, jam; scanf("%s %s %s %d %d", name, teamName, gender, &proN, &jam); memcpy(apps[i].name, name, sizeof(name)); for(int j = 0; j < proN; ++j){ int t; scanf("%d", &t); if(probSet[t] == 1){ apps[i].pts += 2.5; }else if(probSet[t] == 2){ apps[i].pts += 1.5; }else if(isP[t]){ apps[i].pts += 1; }else{ apps[i].pts += 0.3; } } for(int j = 0; j < jam; ++j){ scanf("%d", &japanJam[j]); } if(jam >= 3){ sort(japanJam, japanJam + jam, greater<int>()); if(japanJam[2] - 1200 > 0){ apps[i].pts += (japanJam[2] - 1200) / 100.0 * 1.5; } } if(rank[teamName] == 1){ apps[i].pts += 36; }else if(rank[teamName] == 2){ apps[i].pts += 27; }else if(rank[teamName] == 3){ apps[i].pts += 18; } if(gender[0] == 'F'){//女生+33分 apps[i].pts += 33; } } sort(apps, apps + N); for(int i = 0; i < M; ++i){ printf("%s %.3lf\n", apps[i].name, apps[i].pts); } } return 0; }
3706 把两个砝码任意一个分成两份,求最多能称量的重量总数,数据量很小,直接暴力枚举.
#include <cstdio> #include <memory.h> #include <iostream> #include <algorithm> using namespace std; const int maxn = 201; bool vis[maxn]; int weih[3]; int x, y; int func(int x, int y){ int maxv = 0; for(int i = 1; i < x; ++i){ weih[0] = x - i, weih[1] = i, weih[2] = y; int cnt = 0; sort(weih, weih + 3, greater<int>()); memset(vis, 0 , sizeof(vis)); int &a = weih[0], &b = weih[1], &c = weih[2]; if(a > 0 && !vis[a]){ vis[a] = 1; cnt++; } if(b > 0 && !vis[b]){ vis[b] = 1; cnt++; } if(c > 0 && !vis[c]){ vis[c] = 1; cnt++; } if(a - b > 0 && !vis[a - b]){ vis[a - b] = 1; cnt++; } if(a + b > 0 && !vis[a + b]){ vis[a + b] = 1; cnt++; } if(a - c > 0 && !vis[a - c]){ vis[a - c] = 1; cnt++; } if(a + c > 0 && !vis[a + c]){ vis[a + c] = 1; cnt++; } if(b + c > 0 && !vis[b + c]){ vis[b + c] = 1; cnt++; } if(b - c > 0 && !vis[b - c]){ vis[b - c] = 1; cnt++; } if(a + b + c > 0 && !vis[a + b + c]){ vis[a + b + c] = 1; cnt++; } if(a + b - c > 0 && !vis[a + b - c]){ vis[a + b - c] = 1; cnt++; } if(a - b - c > 0 && !vis[a - b - c]){ vis[a - b - c] = 1; cnt++; } if(a - b + c > 0 && !vis[a - b + c]){ vis[a - b + c] = 1; cnt++; } maxv = max(maxv, cnt); } return maxv; } int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d %d", &x, &y); int ans = 0; ans = max(ans, func(x, y)); ans = max(ans, func(y, x)); printf("%d\n", ans); } return 0; }
3708 给出一个图,求出边和点之间的比率,直接把重复边去掉,除一下就是结果了...
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int maxn = 501; bool vis[maxn][maxn]; int se[maxn], ee[maxn], n, m; int main(){ int T; scanf("%d", &T); while(T--){ memset(vis, 0 , sizeof(vis)); scanf("%d %d", &n, &m); int ecnt = m; for(int i = 0; i < m; ++i){ scanf("%d", &se[i]); } for(int i = 0; i < m; ++i){ scanf("%d", &ee[i]); } for(int i = 0; i < m; ++i){ if(!vis[se[i]][ee[i]]){ vis[se[i]][ee[i]] = vis[ee[i]][se[i]] = 1; }else{ ecnt --; } } printf("%.3lf\n", (double)ecnt / n); } return 0; }
3710 给出一个朋友关系图,如果两个人拥有超过k个共同朋友,那么几天后他们就能成为朋友,求经过足够的时间后,最多能行成多少新的朋友关系,要注意的是直到不能再建立新朋友关系为止,直接暴力.
#include <iostream> #include <memory.h> #include <cstdio> using namespace std; const int maxn = 101; bool g[maxn][maxn]; int n, m, k; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d %d %d", &n, &m, &k); memset(g, 0, sizeof(g)); int ans = 0; for(int i = 0; i < m; ++i){ int u, v; scanf("%d %d", &u, &v); g[u][v] = g[v][u] = 1; } while(1){ int t = 0; for(int i = 0; i < n; ++i){ for(int j = 0; j < n; ++j){ if(!g[i][j] && i != j){//还不是朋友 int sum = 0; for(int k = 0; k < n; ++k){ if(g[i][k] && g[j][k]){ sum++;//累计共同朋友 } } if(sum >= k){ t++; g[i][j] = g[j][i] = 1; } } } } if(!t)break; ans += t; } printf("%d\n",ans); } return 0; }
3712 基本上读懂题目已经就能做出来,因为连击是连续的,所以从50到300累加肯定是最大的得分,从300到50累加肯定是最小的得分,
#include <stdio.h> int sc[3]; int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d %d %d", &sc[0], &sc[1], &sc[2]); int minAns = 0, maxAns = 0, combo = 1; for(int i = 2; i >= 0; --i){ int p = 0; if(i == 2)p = 50; else if(i == 1) p = 100; else p = 300; for(int j = 0; j < sc[i]; ++j){ maxAns += p * ((combo - 1) * 2 + 1); combo++; } } combo = 1; for(int i = 0; i < 3; ++i){ int p = 0; if(i == 2)p = 50; else if(i == 1) p = 100; else p = 300; for(int j = 0; j < sc[i]; ++j){ minAns += p * ((combo - 1) * 2 + 1); combo++; } } printf("%d %d\n",minAns, maxAns); } return 0; }
3713 意思是把一行字符串的长度按照找7位一个字节输出,如果长度能够存在7位里,字节的最高位置0,否则只输出7位并且输出字节的最高位置1,直到全部输出长度.
要注意的是有空串要输出00,其他按照16进制输出就可以了,注意要补0.
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int maxn = 3000050 ; char str[maxn]; int main(){ int T; scanf("%d", &T); getchar(); while(T--){ gets(str); int len = strlen(str); int tlen = len; if(len == 0){ printf("00"); } while(tlen){ int content = tlen & 0x7F; tlen = tlen >> 7; if(tlen > 0)content |= 0X80; printf("%02X", content); } for(int i = 0; i < len; ++i){ printf("%02X",str[i]); } printf("\n"); } return 0; }
3715 给出一行数字,求出最大的M个连续数字,首尾向连,开场3分钟不到就有4个过了.
#include <cstdio> #include <iostream> #include <memory.h> using namespace std; const int maxn = 201 * 2; int cdi[maxn],N, M; int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d %d", &N, &M); for(int i = 0; i < N; ++i){ scanf("%d", &cdi[i]); } memcpy(cdi + N, cdi, N * sizeof(int)); int ans = 0; for(int i = 0; i <N; ++i){ int sum = 0; for(int j = 0; j < M; ++j){ sum += cdi[i + j]; } ans = max(ans, sum); } printf("%d\n", ans); } return 0; }
相关文章推荐
- ZOJ 3708 Density of Power Network(水题)
- ZOJ 3708 Density of Power Network (水题)
- ZOJ 3708 Density of Power Network (水题)
- [ACM_水题] ZOJ 3712 [Hard to Play 300 100 50 最大最小]
- [ACM_水题] ZOJ 3714 [Java Beans 环中连续m个数最大值]
- [ACM_水题] ZOJ 3706 [Break Standard Weight 砝码拆分,可称质量种类,暴力]
- HDU1014 POJ1597 UVALive5492 UVA408 ZOJ1314 Uniform Generator【随机函数+水题】
- POJ 2031 && ZOJ 1718--Building a Space Station【最小生成树 && kurskal && 水题】
- ZOJ 2724 Windows Message Queue (优先级队列,水题,自己动手写了个最小堆)
- zoj 3809 The Himalayas 水题 The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
- ZOJ 1350水题不解释
- [ACM_图论] ZOJ 3708 [Density of Power Network 线路密度,a->b=b->a去重]
- ZOJ 3713 In 7-bit(进制转换)
- ZOJ 3705 Applications(模拟题)
- zoj 2482 IP Address(在水题中学知识,欧耶~)
- ZOJ 2433 Highways(水题)
- zoj 1494 Climbing Worm(经典数学水题)
- ZOJ 3708 Density of Power Network(图论)
- zoj 1041 水题
- ZOJ 3710 Friends(暴力或map)