1. 程式人生 > >第七屆ACM程式設計競賽 (SDIBT)

第七屆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;
}