广工新生赛

这是自己第一次打比赛,比赛体验还是不错滴,想写下自己打比赛过程中的想法和错误。

第一题 签到题

题目:奇诺,听说只要n个连续时刻的速度都严格大于零,摩托车就能飞向月球上面诶。
输入:
第一行输入一个整数T(T<=10),代表有T组样例
对于每组样例:
第一行输入一个整数n,(1<=n<=100),代表n个连续时刻的速度。
第二行输入n个整数ai(0<=ai<=100),代表该时刻艾鲁梅斯的速度。
输出:
对于每组样例:
如果艾鲁梅斯能飞往月球就输出“WeRide.ai”(没有引号);
否则输出“Transform Mobility With Autonomous Driving”(没有引号)。
sample:
input:
2
5
1 2 3 4 5
5
1 2 3 4 0
output:
WeRide.ai
Transform Mobility With Autonomous Driving

#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    int t,n,a[105],flag,i;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        flag = 0;
        memset(a,0,sizeof(105));
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            if(a[i] == 0)
            {
                 flag = 1;
            }
        }
         if(flag)
                printf("Transform Mobility With Autonomous Driving\n");
         else
                printf("WeRide.ai\n");
    }
}

一开始wa了好几次呀,后来对照输入输出和自己的代码各种看才发现为了减少时间复杂度在第一个if里面加了break,导致后面没得输入了啊,真是糟糕。。。

第六题 最长连续连号上升子序列

题目:连号的定义是a[i] + 1 == a[i+1],在这样的定义下长度最少为2,也可能并没有所谓连号子串,那长度为1就行了
输入:
第一行一个整数T(T<=15),代表一共有T组样例。
对于每组样例:
第一行一个整数 n, 表示序列长度(1 <= n <= 10000)
第二行 n 个整数 a[i]。(0 <= a[i] <= 10000)
题目保证n的总和不超过30000.
输出:
输出一个整数,表示最长的连号子串的长度。
sample:
input:
2
5
1 2 3 5 6
3
1 3 2
output:
3
1

#include <cstdio>
#include <algorithm>
int a[10005];
using namespace std;
int main()
{
    int t,i,j,ans,n,maxlist,x;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d",&n);
       for(i=0; i<n; i++)
       {
           scanf("%d",&a[i]);
       }
       maxlist = 1;
       for(i=0; i<n-1; i++)
       {
           ans = 1;
           for(j=i+1; j<n; j++)
           {
               if(a[j] == a[j-1] + 1)
               {
                   ans++;
                   maxlist = max(maxlist,ans);
               }
               else
                break;
           }
       }
       printf("%d\n",maxlist);
    }
}

这个题一开始写的时候连本地都没过,真是气死人,最长连续上升子序列,之前有做过这种题,但是今天写来写去都不对,接近崩溃边缘……后来对照运行结果和代码,一步一步想,终于发现了!是判断完是否是连号后面忘记加else break!!怪不得第二个sample一直输出2!!没加else break就不会停,会继续往下循环,那么找的就不是连续连号子序列!只是连号子序列没有连续!!

第七题 是傻逼题呀 小学一年级都会做

题目:如果把自我比作一根绳子,把现实比作一面无限长的笔直的墙,那么这个绳子和这个墙所能围成的最大面积就是那个人的全部。如果把人比作一根长度为n的绳子,那么这根绳子和墙所能围成的最大面积是多少呢?
输入:
共T组测试用例(T<=100)
每行一个正整数N(N<=100)
输出:
对于每组样例
如果能够围出来,则输出一个数,代表绳子和墙所能围成的最大面积;
如果不可能围出来,输出"Impossble"(没有引号)
答案保留八位小数
sample:
input:
2
1
99
output:
0.15915494
1559.87759724
Hint:
pi=acos(-1)

#include <stdio.h>
#include <math.h>
int main()
{
    int t,n;
    double area;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        if(n == 0)
        printf("Impossble");
        else
        {
            area = (n * n) / (2 * acos(-1));
            printf("%.8lf",area);
        }
    }
}

就是简单的数学呀,周长相同时,什么形状面积最大,那当然是圆形咯!但是因为这里有一堵墙,所以墙是直径,绳子只能围半圆,于是n就是半圆的周长,最大的area自然出来了。(点名批评广工的英语水平,impossible都拼错,幸好我是复制党!!)

第十二题 最小公约数和哈希表

题目:如果[a,b]表示a和b的最小公倍数,那么[a,b]/a能得到多少个不同的数字呢?限制条件:a的范围是1到1000。
输入:
第一行输入一个整数T(T<=50),代表有T组样例。
对于每组样例:
输入一个数b(1<=b<=100000)
输出:
对于每个b,输出一个整数,表示[a,b]/a可以得到多少个不同的数。
sample:
input:
1
4
output:
3

#include <stdio.h>
#include <string.h>
int gcd (int m,int n)
{
    return n?gcd(n,m%n):m;
}
int a[1005];

int main()
{
    int t,b,count,i,k;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        scanf("%d",&b);
        count = 0;
        for(i=1; i<=1000; i++)
        {
            a[gcd(i,b)]++;
        }
        for(i=1; i<=1005; i++)
        {
            if(a[i] != 0)
            {
                count++;
            }
        }
        printf("%d\n",count);
    }
}

一开始很傻,以为真的是要求a和b的最小公倍数除以a,然后再统计不同数字,后来想了想,数字范围太tm大了呀,没法做呀,后来列了一下式子,发现很多东西都约掉了,只剩下b/gcd(a,b),那问题变得简单了呀,就求gcd(a,b),然后把那些数字弄成哈希表就完事了啊,棒!不愧是我!

第十三题 水题

题目:如同角谷猜想,对任意的正整数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到正整数值1。世界线的收束也是如此
输入:
第一行读入一个T(T<=50),表示有T组样例
接下来T行,每行一个整数n (2<=n<=200)
输出:
对于每一组样例,输出他的运算过程
两个样例之间用空行分割
sample:
input:
1
3
33+1=10
10/2=5
5
3+1=16
16/2=8
8/2=4
4/2=2
2/2=1

#include <cstdio>
using namespace std;
void trick (int n)
{
    while(n != 1)
    {
        if(n%2 == 0)
        {
            printf("%d/2=%d\n",n,n/2);
            n = n / 2;
        }
        else
        {
            printf("%d*3+1=%d\n",n,n*3+1);
            n = n * 3 + 1;
        }
    }
}

int main()
{
    int n,i,t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        trick(n);
        if(t != 0)
        printf("\n");
    }
}

emmm…没什么好说的,我们接着a下一题吧!

第四题 基础不牢打什么acm.jpg

题目:
众所周知…在常用的基本变量类型有6种,对于每一种基本变量类型中:
int占用4个字节;
bool占用1个字节,
long long占用8个字节,
double占用8个字节,
char占用1个字节,
float占用4个字节。
输入:
第一行一个整数T,代表有T组样例。
对于每组样例:
第一行n标识输入有n行 (n<=100000)
接下来n行如上述所示。
输入保证:
1:每一行只有一个标识
2:输入的基本格式为:
<变量类型> <变量名>;
3:一行只有一个类型
4:变量名的长度不超过10,且对于每组样例,输入的n个变量名均不同
例如
存在:int a;
而不存在:int a,b;
5:n的和不超过200000
输出:
输出用了多少KB(千字节)内存(向上取整)
sample:
input:
1
1
int a;
output:
1

#include <stdio.h>
#include <math.h>
int main()
{
    char a[15],ch;
    int t,n,i,sum,ans;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        getchar();
        sum = 0;
        while(n--)
        {
            gets(a);
            ch = a[0];
            if(ch == 'i')
            sum += 4;
           if(ch == 'b')
            sum += 1;
           if(ch == 'l')
            sum += 8;
           if(ch == 'd')
            sum += 8;
           if(ch == 'c')
            sum += 1;
           if(ch == 'f')
            sum += 4;
        }
        ans = ceil(sum * 1.0 / 1024);
        printf("%d\n",ans);
    }
}

第一眼,这题不难,能做,每种数据类型开头的首字母都不一样,就用字符串的首字母来判断就好了呀,然后ceil是向上取整函数,信心满满写下代码,我敲!!怎么我字符串还没输入就出结果了呢?!换了n种输入方式还是无果,最后傅老大告诉我,连续输入的时候,如果gets前一个是回车的话,gets就吃掉了回车,然后就会以为你已经输入完了,所以在gets前面加个getchar()作为缓冲就好了,然后感慨自己基础真的不牢固啊…

好,然后这两天再慢慢啃那些没思路的题吧…

猜你喜欢

转载自blog.csdn.net/weixin_43678350/article/details/84679961
今日推荐