CSU-ACM2019 summer training (1)

原CF 1138A Sushi for Two

The basic idea

And a continuous state before each state of the dependent and can take the lower limit, when the state changes, the counter is reset

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;cin>>n;int num1=0,num2=0,sum=0;
    int pre=0;
    for(int i=0;i<n;i++)
    {
        int num;cin>>num;
        if(num==1)
        {
            if(pre==2)
                num1=0;
            num1++;
        }
        if(num==2)
        {
            if(pre==1)
                num2=0;
            num2++;
        }
        pre=num;
        sum=max(sum,min(num1,num2));
    }
    cout<<sum*2<<endl;
}

原CF 1141C Polycarp Restores Permutation

The basic idea

Determining the maximum number is at the beginning, it can be derived later, and the original column number starts from 1, by subtracting the difference between the maximum and minimum, and finally determines whether to repeat vector

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;ll q[200020],arr[200020];
vector<ll>brr;
int main()
{
    cin>>n;
    for(int i=0;i<n-1;i++)
    {
        cin>>q[i];
    }
    arr[0]=n;ll maxn=n,minn=9999999;
    for(int i=1;i<n;i++)
    {
        arr[i]=arr[i-1]+q[i-1];
        maxn=max(maxn,arr[i]);
    }
    for(int i=0;i<n;i++)
    {
        arr[i]-=maxn-n;
        brr.push_back(arr[i]);
    }
    sort(brr.begin(),brr.end());
    for(int i=0;i<n-1;i++)
    {
        if(brr[i+1]-brr[i]!=1)
        {
            //cout<<i<<endl;
            cout<<-1<<endl;
            return 0;
        }
    }
    for(int i=0;i<n;i++)
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}

F original title CF 1141E Superhero Battle

The basic idea

Subtracting a first minimum value, determine whether more than H, then reduced cycle, using division, using the last step

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll h,n,arr[200020];
int main()
{
    cin>>h>>n;
    long long sum=0,time=0,minn=0,cnt=0;
    for(int i=1;i<=n;i++)
    {
        cin>>arr[i];
        sum+=arr[i];
        if(sum<minn)
        {
            minn=min(minn,sum);
            cnt=i;  
        }
        if(minn+h<=0)
        {
            cout<<i<<endl;
            return 0;
        }
    }
    //cout<<sum<<" "<<cnt<<endl;
    if(sum>=0&&minn<h)
    {
        cout<<-1<<endl;
        return 0;
    }
    h+=minn;
    time+=cnt;
    time+=(h/(-sum))*n;
    h=h%(-sum);
//  cout<<h<<endl;
    ll i=cnt+1;
    while(h>0)
    {
        if(i%(n+1)==0)i++;
        h+=arr[(i++)%(n+1)];
        //cout<<h<<endl; 
        time++;
    }
    cout<<time;
    return 0;
}

Guess you like

Origin www.cnblogs.com/tldr/p/11222419.html