第七届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\n");
        else
            printf("no\n");
    }
    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\n");
        else
            printf("yes\n");
    }
    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\n",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\n",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\n",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\n");
            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\n");
        else
        printf("%d\n",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\n");
    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\n");
    else
        printf("NO\n");
    return 0;
}

 

posted @ 2018-04-15 20:24  ~~zcy  阅读(333)  评论(0编辑  收藏  举报