2019年湘潭大学程序设计竞赛

A: Who's better?

暴力,没啥好说的。。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=50005;

int main()
{
    int a,b,c;
    int x,y,z;
    cin>>a>>b>>c;
    cin>>x>>y>>z;
    if(a<x) cout<<"2"<<endl;
    else if(a>x) cout<<"1"<<endl;
    else {
        if(b<y) cout<<"1"<<endl;
        else if(b>y)cout<<"2"<<endl;
        else {
            if(c<z) cout<<"1"<<endl;
            else if(c>z) cout<<"2"<<endl;
            else cout<<"God"<<endl;
        }
    }


    return 0;
}

B:Number

暴力,同样没啥好说的

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=50005;

int main()
{
    int T,n;
    cin>>T;
    string s;
    while(T--)
    {
        cin>>n;
        int cou=0;
        while(n!=1)
        {
            if(n%10!=0)
            {
                n++;
                cou++;
            }
            else {
                cou++;
                n/=10;
            }
        }
        cout<<cou<<endl;
    }


    return 0;
}

C:Math Problem

官方求解过程如上。。反正我随便打了个表看了眼192的等差数列。。。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=50005;
inline int read()
{
    char ch = getchar(); int x = 0, f = 1;
    while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}
int main()
{
    int T;
    ll a,b;
    T=read();
    while(T--)
    {
        cin>>a>>b;
        while(b%192!=1) b--;
        while(a%192!=1) a++;
        if(a>b) cout<<"0"<<endl;
        else cout<<(b+a)*((b-a)/192+1)/2<<endl;
    }
    return 0;
}

D:Stone

官方题解如上。

个人想法,要让收益最大,必然是最小的堆去和最大的堆合并,那么排个序,由大堆往小堆合并,最后的时候必然出现最大堆和最小堆的合并,那么就是收益最大的方法。所以排个序求前n-1项和就是答案。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=50005;
inline int read()
{
    char ch = getchar(); int x = 0, f = 1;
    while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}
int a[10005];
int main()
{
    int T,n;
    T=read();
    while(T--)
    {
        n=read();
        for(int i=0;i<n;i++)
        {
            a[i]=read();
        }
        sort(a,a+n);
        ll k=0;
        for(int i=0;i<n-1;i++) k+=a[i];
        printf("%lld\n",k);
    }
    return 0;
}

E:Watermelon

官方题解如上

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=100000+10;
ll a[maxn];
inline int read()
{
    char ch = getchar(); int x = 0, f = 1;
    while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}
int main()
{
    int T;T=read();
    while(T--)
    {
        ll n,m;
        ll index=-1,maxx=-1;
        scanf("%lld %lld",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&a[i]);
            if(maxx<a[i])
            {
                maxx=a[i];
                index=i;
            }
        }
        ll l=m,r=m;
        bool flag=0;
        for(int i=0;;i++,i%=n)
        {
            if(i==index)
            {
                if(l<=0) 
                {
                    flag=1;break;
                }
                l-=a[i],r-=a[i];
            }
            else{
                if(r<=0) 
                {
                    flag=0;break;
                }
                l-=a[i],r--;
            }
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

F:Black & White

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=100000+10;
int  s1[maxn],s2[maxn];
char a[maxn];
inline int read()
{
    char ch = getchar(); int x = 0, f = 1;
    while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();}
    while('0' <= ch && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
    return x * f;
}
int main()
{
    int T;T=read();
    while(T--)
    {
        int n,m;
        n=read();m=read();
        scanf("%s",a+1);
        for(int i=1;i<=n;++i)
        {
            s1[i]=s1[i-1];
            s2[i]=s2[i-1];
            if(a[i]=='1')s1[i]++;
            else s2[i]++;
        }
        int ans=0;
        for(int i=1;i<=n;++i)
        {
            ans=max(ans,i-(lower_bound(s1,s1+1+n,s1[i]-m)-s1));
            ans=max(ans,i-(lower_bound(s2,s2+1+n,s2[i]-m)-s2));
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值