Educational Codeforces Round 90 (Rated for Div. 2)部分题解

A - Donut Shops

题解:
1.我们首先特判一下包装盒里面只有一个物品的情况,如果只装了一个物品,那我们就直接比较这两个物品的单价即可。
2.如果盒子里面装的不止是一键物品,那么我们就需要比较一下之间的单价了,如果价格相等,那么第一件物品肯定有优势(因为它可以一个一个卖),输出1 -1即可;如果第一件价格小于第二件价格,那么第二件物品就会“一无是处”,直接输出1 -1即可,如果第一件物品价格小于第二件物品价格,且单价要大于第二件物品,那么就可以输出1 b。(恰好为b件,肯定买第二件物品话算,因为单价低)

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;


int main()
{
    ll a,b,c,t;
    cin>>t;
    while(t--){
        cin>>a>>b>>c;
        if(b==1){
            if(a>b) cout<<"-1 1"<<endl;
            else if(a<b) cout<<"1 -1"<<endl;
            else cout<<"-1 -1"<<endl;
        }
        else{
            if(a<c){
                cout<<"1 ";
                if(a*b<=c) cout<<-1<<endl;
                else cout<<b<<endl;
            }
            else{
                cout<<-1<<" ";
                cout<<b<<endl;
            }
        }
    }
    return 0;
}

B - 01 Game

题解:
无论以什么样的删除方法删除,最终的结果是一样的,因为是他们每人走一步,所以判断积偶即可。
没删除一次让次数加一,删除方法用string类的erase即可
注意:因为本题范围小,所以使用erase,其实这个函数复杂度很高,不要乱用。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;

string s;
int main()
{
    int t;
    cin>>t;
    while(t--){
        cin>>s;
        int cnt=0;
        bool flag=false;
        while(true){
            flag=false;
            if(s.size()>1)
            for(int i=0;i<s.size()-1;i++){
                if(s[i]!=s[i+1]){
                    flag=true;
                    cnt++;
                    s.erase(i,2);
                    break;
                }
            }
            if(!flag) break;
            //cout<<flag<<endl;
            //cout<<s.size()<<endl;
        }
        if(cnt%2==0) cout<<"NET"<<endl;
        else cout<<"DA"<<endl;
    }
    return 0;
}

C - Pluses and Minuses

题解:这个题目暴力模拟的话肯定会超时啊。
找一下规律,以免放置他重复的进行某些算过的数字,看代码应该可以懂。
就只有一个if语句。

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
string s;
int main()
{
    int t;
    cin>>t;
    while(t--){
        cin>>s;
        ll ans=0,cnt=0,x=0,last=0;
        for(int i=0;i<s.size();i++){
            ans++;
            if(s[i]=='+') cnt++;
            else cnt--;
            if(cnt<0){
                cnt=0;
                ll t=ans;
                ans+=ans-last;
                last=t;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

D - Maximum Sum on Even Positions

题解:
首先我们可以得知,反转偶数段的效果就是让这一段的奇偶反转,这样的话,问题就得到了简化。
我们用一个数组储存相邻之间的积偶差值(奇数-偶数)
有两种情况(数字为下标)
第一种: 1-2 3-4 5-6 这些数字之间调换
第二种: 2-3 4-5 6-7 这些数字之间进行调换
所以我们拿出b,c两个数组来储存着两种差值情况。
然后我们找到最大连续区间和(b,c)这两个数组。
说明一下这个最大值,为什么直接加上这个最大值,因为这个值代表的是反转某段区间后,总值可以加多少
找一个最大值,加上偶区间的数字大小即可。
时间复杂度O(n)

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
ll a[maxn];
ll b[maxn];
ll c[maxn];
ll maxsum(ll a[],int n)
{
    ll ans=0;
    for(int i=0;i<n;i++)
	{
        if(a[i-1]>0)a[i]+=a[i-1];
        else a[i]+=0;
        if(a[i]>ans) ans=a[i];
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        ll ans=0;
        int n;
        scanf("%d",&n);
        for(int i=0;i<n+5;i++){
            a[i]=b[i]=c[i]=0;
        }
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
            if(i%2==0)ans+=a[i];
        }
        int cnt=0;
        for(int i=0;i<n;i+=2){
            b[cnt++]=a[i+1]-a[i];
        }
        cnt=0;
        for(int i=2;i<n;i+=2){
            c[cnt++]=a[i-1]-a[i];
            //cout<<c[i]<<endl;
        }
//        for(int i=0;i<n;i++) cout<<b[i]<<" ";
//        cout<<endl;
//        for(int i=0;i<n;i++) cout<<c[i]<<" ";
//        cout<<endl;
        ll imax=maxsum(b,n/2+2);
        imax=max(imax,maxsum(c,n/2+2));
        //cout<<ans<<" "<<imax<<endl;
        printf("%lld\n",ans+imax);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xxxxxiao123/article/details/106965216