北师大珠海分校2016国庆欢乐赛题解
来源:互联网 发布:织梦的网站源码 编辑:程序博客网 时间:2024/05/01 04:54
Amazing Score
这题长得跟基本的作业题很像,每次输入12个数,奇数位为学分a,偶数位为分数b,总的加权平均分为,然后当b小于60的时候特判一下,整组分数记为0即可
#include<stdio.h>int main(){ int T,x,y; while(~scanf("%d",&T)){ int count = 0; double max = 82.13; while(T--){ int i,flag = 1; double sum = 0,all = 0; for(i = 0;i < 12;i++){ scanf("%d %d",&x,&y); sum += x * y; all += x; if(y < 60) flag = 0; } if(flag){ if(max < sum / all) max = sum / all; if(82.13 <= (sum * 1.0) / all) count++; } } printf("%.2lf %d\n",max,count); }}
BNUZ-Student
公式题,由于题目上已经明确说明无线路由要放在过道正中间,且路由间距不低于1m,通过这两个条件很容易得出答案,sqrt(4 * r * r - m * m) 得出每个路由器在过道可以扫描到的水平距离,如果水平距离小于1,则无法铺盖,大于n则1个路由即可铺盖完全,其他情况用n / d即可,需要向上取整
#include <stdio.h>#include <math.h>int main(){ int T,n,m,r; while(~scanf("%d",&T)){ while(T--){ scanf("%d %d %d",&n,&m,&r); if(r * 2 <= m) printf("Are you kidding me?\n"); else{ double d = sqrt(4 * r * r - m * m); if(d > n) printf("1\n"); else if(d - 1.0 < 0.00001) printf("Are you kidding me?\n"); else{ int ans = ceil(n * 1.0 / d); printf("%d\n",ans); } } } }}
Chessboard
这道题看起来很复杂,其实你会发现。中间那个?并没有什么用因为每一个2x2的正方形都加上了它,等同于都不加它,按照公式的做法,找出可以找出a+b,b+d,d+c,a+c,这之中的最大值max,拿n减去max即为变化量最小值min,然后用min*n即可,要注意min<0的情况,时间复杂度为O(1)。
由于这题n <= 100000,完全可以枚举随意一个角的数,然后去查看别的角的数满不满足,时间复杂度为O(n)
#include <stdio.h>#define ll long longint main(){ ll n,a,b,c,d; while(scanf("%lld %lld %lld %lld %lld",&n,&a,&b,&c,&d) != EOF){ ll need,total = 0; for(ll j = 1;j <= n;j++){ need = j + a + b; if((need - b - d) > n || (need - b - d) < 1){ continue; } if((need - c - d) > n || (need - c - d) < 1){ continue; } if((need - a - c) > n || (need - a - c) < 1){ continue; } total++; } printf("%lld\n",total * n); }}
Doge Major
很裸的模拟,由于图形对称,只需要考虑0.5以内的即可,不难发现每次在多一个水平正方形后会增加4个交点,而每个正方形的竖直边出现的情况为,所以只需要模拟i增加,每次判断是否小于这个水平坐标即可,等于这个坐标的时候要输出-1,小于的话+4,由于图形对称,当f大于0.5的时候用1-f即可得到相同的结论。
#include <stdio.h>int main(){ int T,ans; double a,f1,f2; scanf("%d",&T); while(T--){ scanf("%lf",&a); if(a > 0.5) a = 1 - a; f1 = 0.5,f2 = ans = 0; if(a == 0){ printf("-1\n"); continue; } do{ f1 /= 2; f2 += f1; ans += 4; if(a == f2){ ans = -1; break; } }while(a > f2); printf("%d\n",ans); }}
Exciting
这题是一道纯模拟题,只要把所有坑爹情况都考虑到位就可以了,比如说什么00000,-00000,000.0000,-0.00,e-0000
总体先分成两块,e前一块,e后一块,由于指数为整数,就不需要考虑指数部分的小数点,只需要管e前的小数点,所以e前再分成2块,分别进行处理。拿到整个字符串的时候先搜索一遍,当然也可以一个一个字符吃,边吃边记录小数点和e的位置。
e前小数点前的部分和e后的部分从前往后扫描,把所有+ 0 这两种符号去掉,遇到-记录一下,最后留着打印,e前小数点后的部分从后往前扫描,把所有0去掉。
最后面去完了之后别忘了考虑去完之后只剩下小数点后的数的情况,要记得前面补0,初始化的时候,先把e的下标放记录在总字符串的尾部,l1,r1来记录e前部分的字符串下标,l2,r2来记录e后部分的字符串下标。基本上处理完以后这题就过了,纯模拟,考虑全部情况。
#include <stdio.h>#include <string.h>#define maxn 105char str[maxn],str1[maxn],str2[maxn];int main(){ int len,e,pos1,l1,l2,r1,r2,f1,f2; while(gets(str) != NULL){ pos1 = f1 = f2 = 0; e = len = strlen(str); for(int i = 0;i < len;i++){ if(str[i] == 'e'){ e = i; break; } if(str[i] == '.') pos1 = i; str1[i] = str[i]; } for(int i = e + 1;i < len;i++){ str2[i - e - 1] = str[i]; } l1 = 0,r1 = e - 1,l2 = 0,r2 = len - e - 1; if(pos1){ for(int i = r1;i >= pos1;i--){ if(str1[i] == '.' || str1[i] == '0') r1--; else break; } } for(int i = 0;i < r1;i++){ if(str1[i] == '+' || str1[i] == '0') l1++; else if(str1[i] == '-'){ f1 = 1; continue; } else break; } for(int i = l2;i < r2 - 1;i++){ if(str2[i] == '+' || str2[i] == '0') l2++; else if(str2[i] == '-'){ f2 = 1; continue; } else break; } if(f1){ l1++; if(str1[l1] != '0') printf("-"); } if(str1[l1] == '.') printf("0"); for(int i = l1;i <= r1;i++) printf("%c",str1[i]); if(e != len) printf("e"); if(f2){ l2++; if(str2[l2] != '0') printf("-"); } for(int i = l2;i < r2;i++) printf("%c",str2[i]); puts(""); }}
Function
原本这题有点难度,会卡TLE,由于数据缩小了,直接模拟运算也可以,模拟a,b,x互相转换,用一层循环即可得到答案,但,你会发现a等于a ^ b ^ b, b 等于a ^ b ^ a ^ b ^ b,那么结果就很明显了,一个数异或两次就能变回原本的样子,所以只需要判断n % 3即可
#include <stdio.h>#define ll long longint main(){ ll num[3],n; while(~scanf("%lld %lld %lld",&num[0],&num[1],&n)){ num[2] = num[1] ^ num[0]; printf("%lld\n",num[n % 3]); }}
Game
原本是道数学题,却可以蒙过的一道水题,游戏需要两两之间都有关系,可以构成一个完全图,关系边数为n * (n - 1) / 2,只需要考虑我能赢谁即可,不需要考虑我会输给谁,所以只需要关系边数 % 总事物数为0,这个游戏即为公平的,所以公式为n * (n - 1) / 2 % n。再化简一下,就成了奇偶判断,奇数为公平,偶数不公平。
#include <stdio.h>#define ll long longint main(){ ll n; while(~scanf("%lld",&n)){ n % 2 ? puts("Yes") : puts("No"); }}
Hearth Stone of Paladins
这又是一道读懂题意就能做的题,看着题目跟着模拟即可,能输出的就蓝腮战士和老瞎眼,计算时蓝腮战士的加成为:3*鱼人将军人数+ 暗麟先知人数,老瞎眼加成为:3*鱼人将军人数+ 暗麟先知人数+除了老瞎眼的总人数,最后计算的时候再用加成乘上自身种族人数。在进行判断是否大于n即可。
#include <stdio.h>#include <string.h>int main(){ int n,a,b,c,d,e; while(~scanf("%d %d %d %d %d %d",&n,&a,&b,&c,&d,&e)){ if(n <= (3 * a + e + 2) * b + (3 * a + e + 2 + a + b + d + e) * c) printf("荣耀赐予我力量!\n"); else printf("跟你讲个笑话,圣骑士的斩杀\n"); }}
puts,三目运算符,ll,一律不回答,请仔细看清楚代码
讲道理除了Exciting那题,其他题都很水,就看你们用不用心去写,没有写过的同学加油啦,代码这东西还是很神奇的。
- 北师大珠海分校2016国庆欢乐赛题解
- 北师大珠海分校2017国庆欢乐赛题解
- 北师大新生赛2014 题解
- 北京师范大学珠海分校课件资源库
- 2017长乐国庆欢乐赛Day1
- 十四届北师大校赛题解
- 【PYC#1 欢乐赛】 题解
- 北京师范大学珠海分校2014年军训
- PYC#1欢乐赛第三题题解
- 题解(国庆专场)
- Hiho1041 国庆出游 搜索题解
- 2008珠海赛总结
- 2009珠海赛总结
- 2011ACM珠海赛
- 2016*国庆
- Hash欢乐赛
- 寒假欢乐赛
- 欢乐赛总结
- (GeekBand)C++面向对象高级编程(上)第一周笔记(1)
- MD5摘要算法
- 如何把你的ESP8266-01变成nodemcu Lua
- 输入优化
- 学习笔记 后缀平衡树简要小结(附例题)
- 北师大珠海分校2016国庆欢乐赛题解
- explain字段解释
- 面向对象_多态中向上转型和向下转型
- 引用的超级起步
- 网佳创投创始人唐滔:创业者融资犹如交女友,围而不追,重在吸引
- OpenCV菜鸟纪实(1)
- java基础——类中方法的使用
- 一年轻女董事长对同龄人的忠告:不想穷的要看看
- 前端面试题汇总(五)