2018校赛(记一次最后五分钟过题的人品爆发)

版权声明:欢迎神犇指教 https://blog.csdn.net/sdxtcqs/article/details/79965461

这里写图片描述
第四是我,最后五分钟天命交了一手D题竟然过了。

A 打卡签到!

描述
在去年的新生赛上,由于出题人没有控制好力度,导致现场众多新生进入挂机模式。大力出奇迹,长者很生气,在跟着长者学习了一个后,出题人决定出的更难——哦不是痛改前非,现在出题人开始出题了!已知出题人手上有N道题,每道题的战斗力是一个整数X,其中战斗力不超过5的渣渣题目可以作为签到题,现在请你统计一下,出题人手上一共有几道签到题?
但是有一点需要注意,如果这N道题都是签到题,这会导致一个非常可怕的后果——现场全体新生全部AK,长者肯定会更加的Angry,所以这N道题都应该扔掉然后重新选题,故此时,签到题的数量为0。
输入
第一行为一个整数T(1≤T≤233),代表测试用例的数量。
对于每个测试用例,第一行为一个整数N(1≤N≤233),代表题目总数。接下来的一行有N个整数X(1≤X≤233),代表每道题的战斗力。
输出
对于每组测试用例,在新的一行中输出一个整数,代表签到题的数量。

题如其名,拼手速。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>

using namespace std;

int T,n,a;

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        int ans=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a);
            if(a<=5)
            {
                ans++;
            }
        }
        if(ans==n)
        {
            printf("0\n");
        }
        else
        printf("%d\n",ans);
    }

    return 0;
}

B 超级难题

描述
在这个世界的某个角落,有一个叫做“厦碧之城”的城市,这个城市里居住的人全部都是智商超过70的天才。最近,这群天才们迎来了一个重大活动——他们要选举城市的最高执政官,为了获得更多的选票,他们开始拉帮结派。但他们遇到了一个超级难题:因为他们的智商太高了,所以他们没有什么好的方法可以区分各个天才,这就导致了一些敌对派系的人混入到某个大派系之中进行颠覆活动,为了解决这个超级难题,他们想出了一个绝妙的主意——用身高来区分各个天才,他们默契地形成了一个约定,每个派系中最高的人和最矮的人的身高差不得超过1,现在他们想知道,人数最多的派系中最多可能有几个人?

输入
第一行为一个整数T(1≤T≤233),代表测试用例的数量。
对于每一个测试用例,第一行为一个整数N(1≤N≤233),代表人口的数量;接下来的一行有N个整数X(1≤X≤233),代表每个人的身高。

输出
对于每组测试用例,在新的一行中输出一个整数,代表人数最多的派系中的最大可能人数。

同样是手速题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>

using namespace std;
int T,n;
int a[1000];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        memset(a,0,sizeof(a));
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        sort(a+1,a+1+n);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            int temp=0;
            for(int j=i;j<=n;j++)
            {
                if(a[j]-a[i]<=1)
                {
                    temp++;
                }
            }
            ans=max(ans,temp);
        }
        printf("%d\n",ans);
    }
    return 0;
}

C 圆形上的点

描述
翻阅坐标数据是歌者的工作,判断坐标的诚意是歌者的乐趣。

空间中有许多的坐标在穿行,坐标拾取由主核进行,主核吞下空间中弥散的所有信息,歌者的工作就是对这些坐标进行清理,但所有坐标中,只有一部分是有诚意的。相信没有诚意的坐标常常意味着清理空旷的世界,这样做浪费精力,还有一点点害处,判断坐标的诚意有一些可遵循的规律——这是歌者在上千个时间颗粒中积累的经验,主核会将吞下的坐标映射到一个二维平面中,其中要被清理的那个坐标会被映射到坐标系的原点,其余用于标识位置的坐标集合K会被映射到以原点为圆心的一个圆M上,映射后的坐标都是整数并且唯一,如果圆M上所有的整数坐标点都都出现在了坐标集合K之中,那么要被清理的坐标就是有诚意的。主核将给出圆M的半径和坐标集合K中的元素数量,请你判断要被清理的坐标是否是有诚意的。

输入
第一行为一个整数T(1≤T≤233),代表测试用例的数量。
对于每个测试用例,输入包含两个整数RM(1≤RM≤2.33×109)和K(1≤K≤2.33×109),代表圆M的半径的平方和坐标集合K中的元素数量。

输出
对于每组测试用例,如果坐标是有诚意的,在新的一行中输出”Trustable”,否则输出”Discard”。

判断有几个数能写成平方和即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>

using namespace std;
int T;
long long a,n;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        long long ans=0;
        scanf("%lld%lld",&a,&n);
        for(long long i=1;i<=100000;i++)
        {
            if(sqrt((double)(a-i*i))==(long long)sqrt((double)(a-i*i)))
            {
                ans++;
            }
        }
        if(ans*4<=n)
        {
            printf("Trustable\n");
        }
        else
        {
            printf("Discard\n");
        }
    }

    return 0;
}

D 冬马和纱的博弈游戏

描述
经过不懈的努力,你终于通关了《心跳文学社》,于是你决定玩一把大的,接着你下载了《白色相簿2》,然后你开始玩,但逐渐地你又发现一个问题,似乎你并没有把《心跳文学社》卸载干净,它污染了你的《白色相簿2》,万幸的是,这次你的存档文件并没有被破坏,但游戏中的两个主要角色——冬马和纱和小木曽雪菜在污染中获得了智能,她们决定使用不在游戏剧情设计内的方式来推动剧情发展,她们决定进行一场博弈游戏,获胜者将获得游戏剧情的控制权。

游戏规则是这样的,她们利用管理员权限获得了后续游戏剧情的各个选项,一共有N个,已知每个选项的好感度是Xi,她们轮流进行每个回合的操作,在每个回合,玩家必须从这N个选项中选择一个,并获得它的好感度Xi,然后将这个选项从剧情中移除,直到所有选项均被移除,游戏结束,此时她们将计算她们获得的好感度总和,假设冬马和纱的好感度总和为ST,小木曽雪菜的好感度总和为SO,如果ST−SO可以被3整除,那么冬马和纱获胜,否则小木曽雪菜获胜。嗯……是不是想起了什么不好的回忆?
我们都知道,AI是十分聪明的,这意味着AI创造的AI也是十分聪明的,冬马和纱和小木曽雪菜在每次进行操作的时候均会选择最佳的操作方式,现在你想知道对于给定的局面,谁将成为最后的胜利者。

输入
第一行为一个整数,代表测试用例的组数。
对于每组测试用例,第一行为两个整数,分别为选项的数量N(1≤N≤233)和先进行操作的玩家F∈{0,1},如果F=0,则冬马和纱先进行操作,否则小木曾雪菜先进行操作。接下来的一行有N个整数,代表每一个选项的好感度X(1≤X≤2333)。

输出
对于每组测试用例,如果冬马和纱能获胜,则在新的一行中输出”Touma Kazusa”,否则输出”Ogiso Setsuna”。如果你觉得不能确定谁会获胜,就输出”OUTPUT THIS TO GET WA”。

虽然我多亏最后过了这个题,但我还是想说这个题很坑爹,一个披着博弈论外皮的坑爹题,两人的最优策略都是尽量和上一个人拿一样的,所以对数据全部对3取模后统计0,1,2的个数然后再将个数对2取模得到t0,t1,t2,只有t1,t2都等于0这种情况(其实是两种)才是第一个人赢,否则都是第二个人赢,无关先后手。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>

using namespace std;
int T,n,f;
int a[1000],s[10],t[10];

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        memset(s,0,sizeof(s));
        scanf("%d%d",&n,&f);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            a[i]%=3;
            s[a[i]]++;
        }
        t[0]=s[0]%2;
        t[1]=s[1]%2;
        t[2]=s[2]%2;
        {
            if(t[1]==0&&t[2]==0)
            {
                printf("Touma Kazusa\n");
                continue;
            }
            else
            {
                printf("Ogiso Setsuna\n");
                continue;
            }
        }
    }
    return 0;
}

G 长生的秘密

描述
你正在和「The Elder」探讨长生的秘密,「The Elder」便向你展示了一排青蛙。

「The Elder」告诉你,要进行长生仪式,首先需要准备N只青蛙,然后需要选择一个数X,接着仪式就开始了,首先,获取第1只青蛙的1s,接下来获取第1+X%N只青蛙的1s,然后是第1+(2X)%N只,第1+(3X)%N只……直到遇到一只已经被获取过1s的青蛙,然后这个仪式就结束了,但在最后,你需要在1s时间内计算出你一共获取了多少秒的时间,只有说出这个数字,你才能真正的获取这些时间。现在请你计算这个数字。

输入
第一行为一个整数T(1≤T≤233),代表测试用例的组数。
对于每组测试用例,每一行有两个整数X(1≤X≤2.33×1018)和N(1≤N≤2.33×1018),代表随机选择的数和青蛙的总数。
注意,输入的数字很大,你应该使用「long long」来保存输入的数字,如果你用scanf进行读入,你应该使用「”%lld”」。

输出
对于每组测试用例,输出一行,仅含一个整数,表示你获取的时间总数。

这个题还是蛮有趣的,大概就是每次跳X个数,跳到最了从新头继续算,当遇到重复的时候停止,问停止时跳到过多少数,我做的时候按X和N的大小和能不能整除分类讨论的,其实不需要,最后答案都是N/(GCD(X,N))

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<cmath>
using namespace std;
long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);}
long long n,x;
int T;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld",&x,&n);
        if(x==1)
        {
            printf("%lld\n",n);
            continue;
        }
        long long t=gcd(n,x);
        if(x<=n)
        {
            if(n%x==0)
            {
                printf("%lld\n",n/x);
            }
            else
            {
                if(t==1)
                {
                    printf("%lld\n",n);
                }
                else
                {
                    printf("%lld\n",n/t);
                }
            }

        }
        else
        {
            if(x%n==0)
            {
                printf("1\n");
            }
            else
            {
                if(t==1)
                {
                    printf("%lld\n",n);
                }
                else
                {
                    printf("%lld\n",n/t);
                }
            }
        }
    }
    return 0;
}

剩余题待后续更新。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页