acm期末考试之我解

Problem A
感觉哪里做到过。。

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n!=0)
    {
        int max=INT_MIN,min=INT_MAX;
        int i;
        for(i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            if(a>max)
                max=a;
            if(a<min)
                min=a;
        }
        printf("%d\n",2*(max-min));
        scanf("%d",&n);
    }
return 0;
}

Problem B
简单nim游戏

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,i,sum=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            sum=sum^a;
        }
        if(sum==0)
            printf("JiJi Brother\n");
        else
            printf("WeiWei Brother\n");
    }
return 0;
}

Problem C
开始result[n]<1 || result[n]>500000的||写成了&&,检查很久,WA多次。。

#include<stdio.h>
#include<stdlib.h>
__int64 result[500005];
int main()
{
    int t,i,j;
    result[1]=0;
    for(i=1;i<=(500000/2);i++)
    {
        for(j=i*2;j<=500000;j+=i)
        {
            result[j]+=i;
        }
    }
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        __int64 b=result[n];
        if(result[n]==n||(result[n]<1 || result[n]>500000))
            printf("注定单身\n");
        else if(n==result[b])
        {
            printf("缘分已定\n");
        }
        else
            printf("缘分未到\n");
    }
return 0;
}

Problem D
五题之中最后做出来的,推了好久,开始用一个数组,最后改变策略,对每个量进行递推,总算推出来了,不过感觉做复杂了。。

#include<stdio.h>
#include<stdlib.h>
int main()
{
    __int64 a[50],b[50],r[50];
    a[1]=1,b[1]=0,r[1]=1;
    a[2]=0,b[2]=0,r[2]=1;
    a[3]=4,b[3]=0,r[3]=5;
    a[4]=4,b[4]=0,r[4]=9;
    int i;
    for(i=5;i<=50;i++)
    {
        b[i]=a[i-4];
        a[i]=4*(r[i-1]-b[i-1]-a[i-1]);
        r[i]=r[i-1]-b[i-1]+a[i];
    }
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        printf("%I64d\n",r[n]);
    }
return 0;
}

Problem E
简单数学

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int t;
    int a[14]={366,365,365,365,366,365,365,365,366,365,365,365,366,365};
    int b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d",&t);
    while(t--)
    {
        int i,y,m,d;
        scanf("%d/%d/%d",&y,&m,&d);
        int sum=0;
        for(i=0;i<=y-2000-1;i++)
        {
            sum+=a[i];
        
        }
        if(m==1)
            sum+=d;
        else if(m==2)
            sum+=b[1]+d;
        else if(m>=3)
        {
            int j;
            for(j=1;j<=m-1;j++)
                sum+=b[j];
            if(a[y-2000]==366)
                sum+=1;
            sum+=d;
        }
        int result=sum%5;
        if(result>=1 && result<=3)
            printf("Fishing\n");
        else
            printf("Resting\n");
        

    
    }
return 0;
}