2021年四川省大学生计算机程序设计竞赛

分享个人经历:在二次组队赛中垫底后,博主反思自身技术瓶颈,专注于赛后攻题,包括A-Chuanpai算法、哈希表应用、代码优化等,旨在提升编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二次组队赛,拿了个倒数第一,真是印象深刻,各方面的原因都有一点,主要是现在太菜了
赛后攻题,持续更新
A - Chuanpai

#include<stdio.h>

int main()
{
    int t,i,j,n;
    scanf("%d",&t);
    while(t--)
    {
        int sum = 0;
        scanf("%d",&n);
        for(i=1;i<=6;i++)
        {
            for(j=1;j<=i;j++)
            {
                if(i+j == n)
                {
                    sum++;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

B - Hotpot

//哈希表的简单应用,注意数据可能过大,要找规律。
#include<stdio.h>
#include<iostream>
#include<string.h>
#define Max 100005
using namespace std;

int has[Max];
int favor[Max];
int ans[Max];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(has,0,sizeof(has));
        memset(ans,0,sizeof(ans));
        memset(favor,0,sizeof(favor));
        int n,k,m,i;
        cin>>n>>k>>m;
        for(i=0;i<n;i++)
        {
            cin>>favor[i];
        }
        if(m>=2*n)
        {
            int f = m/(2*n);
            int k = m%(2*n);
            for(i=0;i<2*n;i++)
            {
                int j = i%n;
                if(has[favor[j]]==0)
                {
                    has[favor[j]]++;
                }
                else
                {
                    has[favor[j]]--;
                    ans[j]++;
                }
            }
            for(i=0;i<n;i++)
                ans[i] *= f;
            for(i=0;i<k;i++)
            {
                int j = i%n;
                if(has[favor[j]]==0)
                {
                    has[favor[j]]++;
                }
                else
                {
                    has[favor[j]]--;
                    ans[j]++;
                }
            }
        }
        else
        {
             for(i=0;i<m;i++)
            {
                int j = i%n;
                if(has[favor[j]]==0)
                {
                    has[favor[j]]++;
                }
                else
                {
                    has[favor[j]]--;
                    ans[j]++;
                }
            }
        }
        for(i=0;i<n-1;i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[i]);
    }
    return 0;
}

//以下是队友没找到规律暴力没过的代码
/*#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std;
#define MAXV 100010
int hashv[MAXV];
int favor[MAXV];  //客户最喜欢的
int xinyun[MAXV];
void fun(int n,int k,int m)
{
     int i,j;
        memset(hashv,0,sizeof(hashv));

        i=0;
        for(j=1;j<=m;j++)
        {
            i++;
            //printf("the current i:%d\n",i);
            if(i%n!=0)
               i=i%n;
            else if(i%n==0)
                i=n;
            //printf("iis %d\n",i);
            if(hashv[favor[i]]==0)
                hashv[favor[i]]++;  //放一个喜欢的进去
            else if(hashv[favor[i]])
            {
                hashv[favor[i]]--;
                xinyun[i]++;
               //printf("%d %d\n",i,xinyun[i]);
            }
        }
}
int main()
{
    int T,n,k,m,i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&k,&m);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&favor[i]);
            xinyun[i]=0;
        }
        fun(n,k,m);
        for(i=1;i<=n;i++)
        {
            if(i!=n)
                printf("%d ",xinyun[i]);
            else printf("%d\n",xinyun[i]);
        }
    }
}
*/

D - Rock Paper Scissors
队友ac代码

#include <iostream>

using namespace std;

int main()
{
    long long br,bp,bs;//石头,布,剪刀
    long long dr,dp,ds;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>br>>bp>>bs;
        cin>>dr>>dp>>ds;
        long long b[3]={br,bp,bs};
        long long d[3]={dr,dp,ds};
        long long sum=0;
        int i,j;
        long long D;
        D=(b[0]<=d[1]?b[0]:d[1]);//bob石头对dr布,总分增加
        b[0]-=D;d[1]-=D;sum+=D;

        D=(b[1]<=d[2]?b[1]:d[2]);//bob布对dr剪刀,总分增加
        b[1]-=D;d[2]-=D;sum+=D;

        D=(b[2]<=d[0]?b[2]:d[0]);//bob剪刀对dr石头,总分增加
        b[2]-=D;d[0]-=D;sum+=D;
        for(i=0;i<3;i++)//两人逐项平局
        {
            D=(b[i]<=d[i]?b[i]:d[i]);
            b[i]-=D;
            d[i]-=D;
            sum-=b[i];//减去应该失去的分数
        }
        cout<<sum<<endl;
    }
    return 0;
}
/*在队友的讲解下a了
#include<stdio.h>
#include<iostream>
using namespace std;

int main()
{
    int t;
    long long ans;
    long long x,y,z,a,b,c;            
    scanf("%d",&t);
    while(t--)
    {
        ans = 0;
        long long d = 0;
        scanf("%lld%lld%lld",&x,&y,&z);
        scanf("%lld%lld%lld",&a,&b,&c);
        //前面三个算d的加分
        d = x>b?b:x;
        x -=d;
        b -=d;
        ans +=d;

        d = y>c?c:y;
        y -=d;
        c -=d;
        ans +=d;

        d = z>a?a:z;
        z -=d;
        a -=d;
        ans +=d;
        //接下来算d和b的平分
        d = x>a?a:x;
        x -=d;
        a -=d;

        d = y>b?b:y;
        y -=d;
        b -=d;

        d = z>c?c:z;
        z -=d;
        c -=d;
        //最后剩余的就是b要减去的分
        ans -=(x+y+z);
        printf("%lld\n",ans);
    }
    return 0;
}*/

H - Nihongo wa Muzukashii Desu

#include<stdio.h>
#include<string.h>

int main()
{
    int t;
    char s[35],a[35];
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        scanf("%s",s);
        getchar();
        if(strcmp(s,"ikimasu")==0)
        {
            printf("itte\n");
            continue;
        }
        else if(strcmp(s,"isogimasu")==0)
        {
            printf("isoide\n");
            continue;
        }
        else
        {
            int l = strlen(s);
            if(s[l-7] == 's'&&s[l-6] == 'h'&&s[l-5] =='i')
            {
                s[l-7] = '\0';
                printf("%sshite\n",s);
                 continue;
            }
            else if(s[l-7] == 'c'&&s[l-6] == 'h'&&s[l-5] == 'i')
            {
                s[l-7] = '\0';
                printf("%stte\n",s);
                 continue;
            }
            else if(s[l-6] == 'm'&&s[l-5] == 'i')
            {
                s[l-6] = '\0';
                printf("%snde\n",s);
                 continue;
            }
             else if(s[l-6] == 'b'&&s[l-5] == 'i')
            {
                s[l-6] = '\0';
                printf("%snde\n",s);
                 continue;
            }
             else if(s[l-6] == 'n'&&s[l-5] == 'i')
            {
                s[l-6] = '\0';
                printf("%snde\n",s);
                 continue;
            }
             else if(s[l-6] == 'k'&&s[l-5] == 'i')
            {
                s[l-6] = '\0';
                printf("%site\n",s);
                 continue;
            }
            else if(s[l-6] == 'r'&&s[l-5] == 'i')
            {
                s[l-6] = '\0';
                printf("%stte\n",s);
                 continue;
            }

            else if(s[l-6] == 'g'&&s[l-5] == 'i')
            {
                s[l-6] = '\0';
                printf("%side\n",s);
                continue;
            }
           else if(s[l-5] == 'i')
           {
               s[l-5] == '\0';
               printf("%stte\n",s);
           }
        }
    }
    return 0;
}

K - K-skip Permutation

#include<stdio.h>
#include<iostream>
using namespace std;

int main()
{
    int n, k;
    scanf("%d%d",&n,&k);
    int cnt = 0;
    int i,j;
    for (i = 1; i <= n; i++)
    {
        for (j = 0; j *k + i <= n; j++)
        {
            ++cnt;
            if (cnt < n)
            {
               printf("%d ",j*k+i);
            }
            else
            {
               printf("%d",j*k+i);
            }
        }
        if(cnt == n)
            break;
    }
    return 0;
}

M - True Story
注意这题有个小坑就是速度*时间的值可能很大超过int型,要额外定义个类型装他们的值,因为这个原因白白wa二次。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

#define Max 100005
int s[Max];
int p0[Max],p1[Max],p3[Max];

int main()
{
    int n,k,d,p,i;
    int sum = 0;
    long long x=0,MAX = 0;
    cin>>n>>k>>d>>p;
    for(i=0;i<n;i++)
    {
        cin>>s[i];
    }
    sort(s,s+n);
    for(i=n-1;i>=0;i--)
    {
        x = s[i] *p;
        if(x>=d)
        {
            sum++;
            s[i] = 0;
        }
    }
    for(i=0;i<k;i++)
    {
        cin>>p0[i];
    }
    for(i=0;i<k;i++)
    {
        cin>>p1[i];
    }
    for(i=0;i<k;i++)
    {
        p3[i] = p1[i] -p0[i];
        if(p3[i]  > MAX)
        {
           MAX = p3[i];
        }
    }
    //printf("%d\n",MAX);
    for(i=0;i<n;i++)
    {
        x = s[i] *MAX;
        if(x >= d)
        {
            //printf("%d  ",i);
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子味汽水ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值