ECJTU13级队员欢乐水题赛——题解

来源:互联网 发布:淘宝奥比岛珠宝表情 编辑:程序博客网 时间:2024/04/29 16:16

对于递归写法,显然会TLE,由递归式转化为递推式即可。

#include <cstdio>using namespace std;typedef long long ll;const int mod = 10000007;const int maxn = 100000+5;ll f[maxn];int main(){    int T,tc = 0;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%lld%lld%lld%lld%lld%lld%d",&f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&n);        f[0]%=mod;f[1]%=mod;f[2]%=mod;        f[3]%=mod;f[4]%=mod;f[5]%=mod;        for(int i = 6;i <= n; ++i)            f[i] = (f[i-1] + f[i-2] + f[i-3] + f[i-4] + f[i-5] + f[i-6])%mod;        printf("Case %d: %lld\n",++tc,f[n]);    }    return 0;}

B

模拟题

#include <cstdio>using namespace std;int main(){    int t,tc = 0;    scanf("%d",&t);    while(t--)    {        int a,b;        scanf("%d%d",&a,&b);        int ans=a-b;        ans>0?ans:ans*=-1;        ans+=a;        ans*=4;        ans+=19;        printf("Case %d: %d\n",++tc,ans);    }    return 0;}

C

模拟题,暴力即可。

#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100+5;int a[maxn];char str[10];int main(){    int t,tc = 0;    scanf("%d",&t);    while(t--)    {        int n,m;        scanf("%d%d",&n,&m);        for(int i = 1; i <= n ;++i) scanf("%d",&a[i]);        while(m--)        {            scanf("%s",str);            if(str[0]=='P')            {                int x,y;                scanf("%d%d",&x,&y);                x++;y++;                swap(a[x],a[y]);            }            else if(str[0]=='R')            {                for(int i = 1;i <= n/2; ++i)                    swap(a[i],a[n+1-i]);            }            else if(str[0]=='S')            {                int num;                scanf("%d",&num);                for(int i = 1;i <= n; ++i) a[i] += num;            }            else if(str[0]=='M')            {                int num;                scanf("%d",&num);                for(int i = 1;i <= n; ++i) a[i] *= num;            }            else            {                int num;                scanf("%d",&num);                for(int i = 1;i <= n; ++i) a[i] /= num;            }        }        printf("Case %d:\n",++tc);        for(int i=1;i<=n;i++)  printf("%d%c",a[i],i == n ?'\n':' ');    }    return 0;}

D

要求输出满足N*M = W的最小M和与其对应的N

显然当M为2的幂次时,M最小

#include <cstdio>#include <iostream>using namespace std;typedef long long ll;int main(){    int t,tc = 0;    scanf("%d",&t);    while(t--)    {        ll n;        scanf("%lld",&n);        printf("Case %d: ",++tc);        if(n&1)            printf("Impossible\n");        else        {            ll ans = 1;            while(n%2==0){                ans*=2;                n/=2;            }            printf("%lld %lld\n",n,ans);        }    }    return 0;}


E

熟悉国际象棋的规则就是水题= =


#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>using namespace std;int main(){    int t,tc = 0;    scanf("%d",&t);    while(t--)    {        int x1,y1,x2,y2;        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);        printf("Case %d: ",++tc);        x1=abs(x1-x2);        y1=abs(y1-y2);        if(x1 == y1)  ///对角线上            printf("1\n");        else        {            if(x1%2==y1%2)                printf("2\n");            else                printf("impossible\n");        }    }    return 0;}

F

贪心思想的运用= =

尽可能选小的能保证最多

#include <cstdio>#include <algorithm>using namespace std;const int maxn = 50;int a[maxn];int main(){    int T,tc = 0;    scanf("%d",&T);    while(T--)    {        int n,p,q;        scanf("%d%d%d",&n,&p,&q);        for(int i = 0; i < n; ++i) scanf("%d",&a[i]);        sort(a,a+n);        int ans = 0,cnt = 0;        while(q >= 0 && cnt < n)        {            if(ans >= p || q < a[cnt]) break;            q -= a[cnt++];            ++ans;        }        printf("Case %d: %d\n",++tc,ans);    }    return 0;}

G

考查结构体排序

#include <cstdio>#include <algorithm>#include <iostream>using namespace std;struct stu{    char name[25];    int sum;};bool cmp(stu x,stu y)  {    return x.sum<y.sum;}stu s[101];int main(){    int t,tc = 0;    scanf("%d",&t);    while(t--)    {        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            int x,y,z;            scanf("%s%d%d%d",s[i].name,&x,&y,&z);            s[i].sum=x*y*z;        }        printf("Case %d: ",++tc);        sort(s+1,s+n+1,cmp);        if(s[1].sum == s[n].sum)            printf("no thief\n");        else        {            printf("%s took chocolate from %s\n",s[n].name,s[1].name);        }    }    return 0;}


0 0