• 第七届ACM程序设计竞赛 (SDIBT)


    1.淘气的蜡笔小鑫

    蜡笔小鑫真是又闲又淘气,他看到走廊上的灯都是灭的,就跑过去捣乱。每个灯泡都有自己的开关,用来控制灯的状态(开或者关)。如果灯灭了,按一下开关即开灯,再按一次即关灯。假设走廊里有n个灯泡,蜡笔小鑫就沿着走廊来回走n次。每次都是沿走廊走下去然后再回来,并且当他在走第i次时,都会按一下所有位置可被i整除的灯的开关(每次他都只在去的时候按下开关,回来的时候未进行任何操作),例如:n=8,i=3时,他在走第3次的时候按下了序号为3和6的灯的开关。他想知道最后一个灯泡的最终状态到底是开还是关,你能帮帮他吗?

    Input输入包含一个正整数n(n≤232-1),表示蜡笔小鑫沿着走廊来回走了n次。

    Output输出单行结果,如果最后一个灯泡是开的,输出“yes”,否则,输出“no”。

    Sample Input

    3
    6241
    8191

    Sample Output

    no
    yes
    no
    
    #include <stdio.h>
    #include <string.h>
    int main()
    {
        int n,a[10000],i,j;
        while(~scanf("%d",&n))
        {
            memset(a,0,sizeof(a));
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=n;j++)
                    if(i%j==0)
                   {
                       if(a[i]==0)
                          a[i]=1;
                       else
                          a[i]=0;
                   }
            }
            if(a[n]==1)
                printf("yes
    ");
            else
                printf("no
    ");
        }
        return 0;
    
    }

     

    (暴力肯定时间超限,下面是简单做法,直接判断因子个数)

    #include<stdio.h>
    #include <math.h>
    int main()
    {
        int n,i,k;
        while(~scanf("%d",&n))
        {
            int ans=0;
            k=sqrt(n);
            for(i=1;i<k;i++)
                if(n%i==0)
                   ans+=2;
            if(k*k==n)
                ans++;
            if(ans%2==0)
                printf("no
    ");
            else
                printf("yes
    ");
        }
        return 0;
    }

    2.

    今天是星期三,是本周的第三天,明天是2015年的最后一天。在2016年,小壮打算买些水晶玫瑰花送给他的女朋友!他设计了两种购买方案。第一种方案是在每周固定的某天购买一枝水晶玫瑰,第二种方案是在每月固定的某天购买一枝。他只可选择其中一种方案。小壮想知道他在2016年总共能买多少枝水晶玫瑰,小壮笨笨的,你能帮帮他吗?

    Input

    输入只可能有两种格式:

    (1)"x of week" ,(1 ≤ x ≤ 7),即在每周的第X天购买一枝水晶玫瑰花。

    (2)"x of month" ,(1 ≤ x ≤ 31),即在每月的第X天购买一枝水晶玫瑰花。

    Output

    输出单行,表示小壮在2016年所购买的水晶玫瑰的总数。

    Sample Input

    4 of week
    30 of month

    Sample Output

    52
    11

    是否是闰年的判断方法(year%4==0&&year%100!=0||year%400==0)

    所以2016是闰年,2月29天,平年2月28天

    #include <stdio.h>
    
    int main()
    {
        int a[14]={0,31,29,31,30,31,30,31,31,30,31,30,31},i,n,sum=0;
        char s[10];
        while(~scanf("%d",&n))
        {
            sum=0;
            getchar();
            gets(s);
            if(s[3]=='w')
            {
               if(n==5||n==6)(2016年第一天是星期5,366%7=2)
                 sum=53;
               else
                sum=52;
            }
           if(s[3]=='m')
           {
              for(i=1;i<=12;i++)
                if(n<=a[i])
                  sum++;
           }
           printf("%d
    ",sum);
        }
        return 0;
    
    }

     

    3.小茜的减肥之路

    今天,多年未见的小钧和小江在街头偶遇,小江想看看当年那个蠢蠢的小钧有没有变聪明一些,他灵机一动,说:“当初小茜立了个flag,说一定要减肥,她想着第一天跑一米,第二天跑两米,第三天跑三米……第n天跑n米。我问你,小茜一共跑了多少米。”小钧左思右想,就是想不出来,他心底暗骂小茜,没事立什么flag!但是他并不想让小江看扁,所以想请你偷偷地帮忙算一下小茜这n天一共跑了多少米,小钧傻傻的,你能帮帮他吗?

    Input

    输入一个整数n(n<109),表示跑了n天。

    Output

    输出单行结果,表示总共跑了多少米。

    Sample Input

    6
    

    Sample Output

    21
    
    正常写肯定时间超限,用求和公式
    #include<stdio.h>
    int main()
    {
        long long int n,s;
        scanf("%lld",&n);
        s=n*(n+1)/2;
        printf("%lld
    ",s);
        return 0;
    
    }

     

    4.(水题)

    抗战时期,小飞作为特工,成功打入了敌方内部,为我方提供了许多关键性的情报。为了防止电报被截而泄露机密,小飞和他的联系人小珲制定了一个密码本,内容如下:电报中的0实际上是2,1实际就是1,2实际是1/2,4实际是1/4,8实际是1/8,16实际是1/16。小飞的联系人小珲,专门负责翻译他的电报,并计算翻译过后的实际数字的加和,便能懂得小飞想传达的信息。可今天小珲比较忙,你作为他的助理,哈哈~那就请你按照规定进行求和叭~你能帮帮他吗?

    Input

    第一行输入一个数字N(1≤N≤2000),表示电报中数字的数量;

    第二行输入N个数字,表示电报中的数字;

    Output输出单行结果,即按规定计算出的加和(保留四位小数)。

    Sample Input

    10
    1 2 2 2 1 4 4 8 8 16

    Sample Output

    4.3125
    #include <stdio.h>
    int main()
    {
        int i,n,a[100000];
        double s=0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==0)
                s+=2;
            else
                if(a[i]==2||a[i]==4||a[i]==8||a[i]==16)
                   s+=(double)1/a[i];
                else
                    s+=a[i];
        }
        printf("%.4lf
    ",s);
        return 0;
    
    }

     

    5.

    有人送了苗苗一个小火车的玩具,小火车由n个车厢组成,按顺序从1到n编号(所有车辆的编号都是不同的)。有天,她一不小心,哎呀!把小火车的车厢顺序都给搞乱了,这可怎么办呀!她只希望能够按照编号从小到大的顺序重新排列,可是她每次只能将其中两节车厢的位置互相交换,这绕来绕去的可把她给绕晕了啊。她实在是太懒了,只想尽可能少的移动车厢。苗苗想知道最少的移动次数,你能帮帮她吗?

    Input

    第一行为一个正整数n(n<1000),表示有n节车厢。

    第二行为n个正整数,用空格分开,表示目前车厢序号的排列情况。

    Output

    输出单行结果,表示至少交换多少次,才能完成排序。

    Sample Input

    5
    3 1 2 5 4
    

    Sample Output

    3

    (直接i跟i+1后面的最小交换)

    #include <stdio.h>
    
    int a[10000];
    int YANG(int j,int n)
    {
        int min=1000,i,c;
        for(i=j;i<n;i++)
            if(a[i]<min)
              {
                 min=a[i];
                 c=i;
              }
        return c;
    }
    int main()
    {
        int n,i,s=0,j,t;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(i=0;i<n;i++)
            for(j=i+1;j<n;j++)
            {
                int c=YANG(j,n);
                if(a[i]>a[c])
               {
                  t=a[i];
                  a[i]=a[c];
                  a[c]=t;
                  s++;
               }
            }
        printf("%d",s);
        return 0;
    
    }

     

    6.

    Marjar Cola上市啦!!!为了吸引更多的顾客,吃货公司的老板小茜决定推出一项活动:集齐x个空瓶或y个瓶盖,即可召唤神龙,免费获得一瓶完整的Marjar Cola!!!WoW~哇哦!!!!
    而现在呢,小斯最初有a个空的可乐瓶和b个可乐瓶盖,他想尽可能多喝可乐(喝穷他!)。他想知道自己可以喝到几瓶Marjar Cola,你能帮帮他吗?
    请注意:小斯只去吃货公司买可乐,一瓶可乐也只包含一个可乐瓶和一个瓶盖。并且小斯最初的可乐瓶和可乐盖都是别人给的,不算自己喝的。

    Input

    输入包括4个数,x,y,a,b(1 ≤ x, y, a, b ≤ 100)。

    Output

    输出单行结果,小斯可以喝到几瓶可乐,若为无数瓶,则输出“INF”。

    Sample Input

    1 3 1 1
    4 3 6 4

    Sample Output

    INF
    4
    #include <stdio.h>
    int main()
    {
        int x,y,a,b,i;
        while(~scanf("%d%d%d%d",&x,&y,&a,&b))
        {
            if(x==1||y==1)
            {
                printf("INF
    ");
                continue;
            }
            int s=0;i=0;
            while(1)
            {
                if(a>=x)
                {
                    s+=a/x;
                    b+=a/x;
                    a=a%x+a/x;
                }
                if(b>=y)
                {
                    s+=b/y;
                    a+=b/y;
                    b=b/y+b%y;
                }
                if(a<x&&b<y)
                    break;
                i++;
                if(i>1000)
                    break;
            }
            if(i>=1000)
                printf("INF
    ");
            else
            printf("%d
    ",s);
        }
        return 0;
    
    }

     

    7.

    大家都知道实验室里小莉,小晨和小芹是非常非常要好的朋友,但是最近呢,这三个人感觉真的是太无聊太无聊太无聊了!有天,小莉突发奇想,想来测试一下她们仨的默契程度。她们三个人每人都自己找了一个矩形的木板,看这三个木板能不能拼成一个正方形。如果能,那就代表着她们真是的很有很有默契的咯~如果不能,或许就没有那么有默契辣。这可把小莉愁坏了啊,她们到底有没有默契呀?你能帮帮她吗?

    Input

    输入包括三行,第一行代表第一个矩形的长h(h<1000)和宽w(w<1000),第二行代表第二个矩形的长h(h<1000)和宽w(w<1000),第三行代表第三个矩形的长h(h<1000)和宽w(w<1000)。

    Output

    输出单行结果,如果有默契请输出“YES”,否则输出“NO”,输出没有双引号。

    Sample Input

    8 2
    1 6
    7 6

    Sample Output

    YES

    总是不对 找到后台 问题出在了7 5 7 5 10 3上,后台没有2 2 2 2 2 2这组数据

    思路:先对结构体进行排序,最大的在第一列,而且按从大到小排,判断最后两组数据有没有相加等于最大的数,而且剩下的两个数是不是相等,且与第二个数据相加是不是等于第一个数。

    注意:判断三个数是否想等,不能用2个连等号。

    #include <iostream>
    
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    struct XY
    {
        int x,y;
    }s[3];
    bool cmp(struct XY a,struct XY b)
    {
        return a.x>b.x;
    }
    int main()
    {
        int i,t,z=0;
        for(i=0;i<3;i++)
        {
            scanf("%d%d",&s[i].x,&s[i].y);
            if(s[i].x<s[i].y)
            {
                t=s[i].x;
                s[i].x=s[i].y;
                s[i].y=t;
            }
        }
        if(s[0].x==s[1].x&&s[1].x==s[2].x&&s[0].y==s[1].y&&s[1].y==s[2].y&&s[0].x!=s[0].y)
            printf("YES
    ");
        sort(s,s+3,cmp);
        if(s[1].x+s[2].x==s[0].x)
        {
            if(s[1].y==s[2].y&&s[1].y+s[0].y==s[0].x)
                z++;
        }
        if(s[1].x+s[2].y==s[0].x)
        {
            if(s[2].x==s[1].y&&s[1].y+s[0].y==s[0].x)
                z++;
        }
        if(s[2].y+s[1].y==s[0].x)
        {
            if(s[1].x==s[2].x&&s[1].x+s[0].y==s[0].x)
                z++;
        }
        if(s[1].y+s[2].x==s[0].x)
        {
            if(s[1].x==s[2].y&&s[1].x+s[0].y==s[0].x)
                z++;
        }
        if(z>0)
            printf("YES
    ");
        else
            printf("NO
    ");
        return 0;
    }
  • 相关阅读:
    Android之json解析
    关闭Android/iPhone浏览器自动识别数字为电话号码
    CSS 公共样式摘自万能的度娘
    前端必备:六款CSS工具让代码充满魅力
    移动端JS 触摸事件基础
    height:100%和height:auto的区别
    线程之生产汽车与购买汽车
    SAXCreateXMLDocument
    DOM方式创建XML文件
    java快捷键
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702818.html
Copyright © 2020-2023  润新知