北师大珠海分校2016国庆欢乐赛题解

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值