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 long
int 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 105
char 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 long
int 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 long
int 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那题,其他题都很水,就看你们用不用心去写,没有写过的同学加油啦,代码这东西还是很神奇的。