2019年湘潭大学程序设计竞赛(重现赛)

谁都会走 提交于 2021-02-13 05:03:21

https://ac.nowcoder.com/acm/contest/893#question

A:签到1

#include<algorithm>
#include<cstring>
#include<iostream>
#include<math.h>
#include<string>
#include<stdio.h>
#include<map>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;

int n1,n2,p1,p2,s1,s2;
int main()
{
    while(cin>>n1>>p1>>s1>>n2>>p2>>s2)
    {
        if(n1>n2)
            printf("1\n");
        else if(n1<n2)
            printf("2\n");
        else
        {
            if(p1<p2)
                printf("1\n");
            else if(p1>p2)
                printf("2\n");
            else
            {
                if(s1<s2)
                    printf("1\n");
                else if(s1>s2)
                    printf("2\n");
                else
                    printf("God\n");
            }
        }
    }
    return 0;
}
View Code

B:签到2

#include<algorithm>
#include<cstring>
#include<iostream>
#include<math.h>
#include<string>
#include<stdio.h>
#include<map>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
 
int n;
ll a[300005];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
    {
        ll x=a[i];
        ll cnt=0;
        while(x>1)
        {
            if(x%10==0)
                x=x/10;
            else
                x++;
            cnt++;
        }
        printf("%lld\n",cnt);
    }
    return 0;
}
View Code

C:签到3,打印观察a的值有规律,192的倍数+1,等差求和

#include<algorithm>
#include<cstring>
#include<iostream>
#include<math.h>
#include<string>
#include<stdio.h>
#include<map>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
 
int t;
ll l,r,n;
 
int main()
{/*
    for(ll i=1;i<=10000;i++)
        if(i*i*i%192==1)
        printf("%lld\n",i);*/
    scanf("%d",&t);
    while(t--)
    {
        cin>>l>>r;
        ll sum=0;
        while(l%192!=1)
            l++;
        while(r%192!=1)
            r--;
 
        n=r/192-l/192+1;
        sum=((l+r)/2)*n;
        printf("%lld\n",sum)
    }
    return 0;
}
View Code

D:签到4,每次依附到最大的那一堆,结果是:总和-最大

#include<algorithm>
#include<cstring>
#include<iostream>
#include<math.h>
#include<string>
#include<stdio.h>
#include<map>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
 
int t,n;
 
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        ll maxx=-1,sum=0,x;
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&x);
            sum+=x;
            maxx=max(maxx,x);
        }
        printf("%lld\n",sum-maxx);
    }
 
    return 0;
}
View Code

F:尺取法,详看注释

#include<algorithm>
#include<cstring>
#include<iostream>
#include<math.h>
#include<string>
#include<stdio.h>
#include<map>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
 
int t;
int n,m;
string s;
 
int main()///尺取法
{
    scanf("%d",&t);
    while(t--)
    {
        cin>>n>>m;
        cin>>s;
 
        int num,l,r,k,ans;///num表示当前的价值,k表示当前执行了多少次操作
        ans=k=num=l=r=0;
        while(r<n)///算0的价值
        {
            while(  (r<n && k<m)||(s[r]=='0') )///有操作机会 或者 当前是0即不需要操作
            {
                if(s[r]=='0')
                {
                    num++;
                    r++;
                }
                else if(s[r]=='1' && k<m)
                {
                    num++;
                    k++;
                    r++;
                }
                ans=max(ans,num);
            }
            ///r走不动了,轮到l来走
            if(s[l]=='0')
            {
                num--;
                l++;
            }
            else
            {
                num--;
                k--;///之前用一次机会把1变成0,现在不要这个1,操作次数要减少
                l++;
            }
            ans=max(ans,num);
        }
        k=num=l=r=0;
        while(r<n)///算1的价值
        {
            while(  (r<n && k<m)||(s[r]=='1') )///有操作机会 或者 当前是0即不需要操作
            {
                if(s[r]=='1')
                {
                    num++;
                    r++;
                }
                else if(s[r]=='0' && k<m)
                {
                    num++;
                    k++;
                    r++;
                }
                ans=max(ans,num);
            }
            if(s[l]=='1')
            {
                num--;
                l++;
            }
            else
            {
                num--;
                k--;///之前用一次机会把0变成1,现在不要这个0,操作次数要减少
                l++;
            }
            ans=max(ans,num);
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!