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

 

目录

A    Who's better?

B    Number

C    Math Problem

D    Stone

E    Watermelon

F    Black & White

//G    Truthman or Fakeman//H    Chat


A    Who's better?

凭实力疯狂冗余的代码。。。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 100010;
const int mod  = 1e9+7;
int main()
{
    int n1,n2,p1,p2,s1,s2;
    while(cin>>n1>>p1>>s1)
    {
        cin>>n2>>p2>>s2;
        if(n1 == n2)
        {
            if(p1 == p2)
            {
                if(s1 == s2)
                    puts("God");
                else
                {
                    if(s1 < s2)
                        cout<<1<<endl;
                    else
                        cout<<2<<endl;
                }
            }
            else
            {
                if (p1 < p2)
                    cout << 1 << endl;
                else
                    cout << 2 << endl;
            }
        }
        else
        {
            if (n1 > n2)
                cout << 1 << endl;
            else
                cout << 2 << endl;
        }
    }
    return 0;
}

B    Number

这题居然不卡时间。。我酸了

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 100010;
const int mod  = 1e9+7;

int main()
{
    ios::sync_with_stdio(false);
    int t;
    ll num,n,cnt=0;
    cin>>t;
    while(t--)
    {
        cnt = 0;
        cin>>num;
        n = num;
        while(num > 1)
        {
            if(num%10 == 0)
                num /= 10;
            else
                num += 1;
            cnt++;
        }
       cout<<cnt<<endl;
    }
    return 0;
}

C    Math Problem

打表把前几千个写出来看看,找规律,简化公式

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    for(int ri = 0; ri< t;ri++)
    {
        ll le,r,x,y,sum = 0;
        cin>>le>>r;
        x = (le - 1)/192;
        y = (r - 1)/192;
        for(ll i = x + 1;i <= y;i++)
            sum += (1 + 192 * i);
        if(x*192 + 1 >= le)//注意这里要判断一下
            sum += (x*192 + 1);
        cout<<sum<<endl;
    }
    return 0;
}

D    Stone

思维,想明白每一次加的是数组种的哪些数,举个例子写一写,除了最大的那个数字其他全部加起来就是最小体力值

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 10010;
const int mod  = 1e9+7;
ll a[maxn];
int t;
ll n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        ll sum = 0,Max = -1;
        memset(a,0,sizeof(a));
        scanf("%lld",&n);
        for(int i = 0;i < n;i++)
        {
            scanf("%lld",&a[i]);
            sum += a[i];
            if(a[i] > Max)
                Max = a[i];
        }
        if(n == 1)
            printf("0\n");
        else
            printf("%lld\n",sum-Max);
    }
    return 0;
}

E    Watermelon

思维,把每个人可取的范围变化放到大范围L,R中

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
ll a[maxn];
ll n,m;
int t;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld",&n,&m);
        int maxdis = 1;
        for(int i = 1;i <= n;i++)
        {
            a[i] = 0;
            scanf("%lld",&a[i]);
            if(a[i] > a[maxdis])//更简便的写法get
                maxdis = i;
        }
        int tmp = 1,l = m,r = m;//初始L=R=m
        while(1)
        {
            if(tmp > n)//注意易错!!写成tmp %= n,只在下标是0~n-1的时候合适!!!!!
                tmp -= n;
            if(tmp == maxdis)//对于肚量最大的人L和R都减去a[i]
            {
                if(r <= 0)//肚量最大的人吃西瓜时R<0,那么说明可以成功,得到答案为Yes
                {
                    printf("YES\n");
                    break;
                }
                l -= a[tmp];//注意!!不要同一个变量全局定义一次,里面又定义一次!!易错!!尤其是这个t
                r -= a[tmp];
            }
            else//对于非肚量最大的人L每次减一(至少吃一个),R每次减去能a[i](至多吃a[i]个)
            {
                if(l <= 0)//直到某个非肚量最大的人吃西瓜的时候如果L<0,得到答案为No
                {
                    printf("NO\n");
                    break;
                }
                l -= 1;
                r -= a[tmp];
            }
            tmp++;
        }
    }
    return 0;
}


F    Black & White

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
typedef struct {
    int c0 = 0,c1 = 0;
}node;
int t,n,m;
node a[maxn];
char s[maxn];
bool judge(int x,int y)
{
    if(a[y].c0 - a[x].c0 <= m || a[y].c1 - a[x].c1 <= m)
        return true;
    return false;
}
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>s+1;
        for(int i = 1;i <= n;i++)
        {
            a[i] = a[i-1];
            if(s[i] == '0')
                a[i].c0++;
            else
                a[i].c1++;
        }
        int r = 0,ans=0,Max = -1;
        for(int i = 0;i <= n;i++)//枚举左边起始点
        {
            r = i + 1;
            while(r <= n && judge(i,r))
                r++;
            ans = r - i - 1;
            Max = max(ans,Max);
        }
        cout<<Max<<endl;
    }

    return 0;
}


//G    Truthman or Fakeman
//H    Chat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值