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

0 0