AIM Tech Round 3 (Div. 2)

A题,读错题意,坑了好久,大于d的橘子不用加,每次总和大于b之后就要清空,然后答案加1

#include<bits/stdc++.h>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define pii pair<int,int>
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,b,d,ans=0,sum=0;
    cin>>n>>b>>d;
    for(int i=0;i<n;i++)
    {
        int a;
        cin>>a;
        if(a>b)continue;
        sum+=a;
        if(sum>d)sum=0,ans++;
    }
    cout<<ans<<endl;
    return 0;
}
/********************

********************/
A

B题,先判断初始点是不是在最左边(或最右边)这样直接一次走到第n-1(2)个就行了,再判断从左(右)边走到最右边-1,从右(左)边走到最左边-1的最小值就好了

#include<bits/stdc++.h>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define pii pair<int,int>
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f;

int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    if(n==1)
    {
        cout<<0<<endl;
        return 0;
    }
    sort(a+1,a+1+n);
    if(k<=a[1])
    {
        cout<<a[n-1]-k<<endl;
        return 0;
    }
    if(k>=a[n])
    {
        cout<<k-a[2]<<endl;
        return 0;
    }
    int ans=min(min(abs(k-a[2]),abs(k-a[n]))+abs(a[2]-a[n]),min(abs(k-a[n-1]),abs(k-a[1]))+abs(a[n-1]-a[1]));
    cout<<ans<<endl;
    return 0;
}
/********************

********************/
B

C题,从第一次出现不是a的开始,一直更新到出现a为止,注意特判全是a的情况

#include<bits/stdc++.h>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define pii pair<int,int>
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin>>s;
    int i=0;
    while(i<s.size())
    {
        if(s[i]=='a')i++;
        else break;
    }
    if(i==s.size())
    {
        cout<<s.substr(0,s.size()-1)+'z'<<endl;
        return 0;
    }
    while(i<s.size())
    {
        if(s[i]!='a')s[i]--,i++;
        else break;
    }
    cout<<s<<endl;
    return 0;
}
/********************

********************/
C

D题,特判b==0,c==0,a==0或d==0的情况,如果不能找到对应00,11的值就输出impossible,可以先预处理打个表,此时1的个数*0的个数一定等于b+c

把0尽可能放在最左边,和最右边,直到b<1的个数,c<1的个数而且b+c==1的个数,最后遍历一边找出现b次1的位置放0就好了

#include<bits/stdc++.h>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define pii pair<int,int>
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f;

map<ll,ll>ans;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    for(ll i=1;i<=1e5;i++)ans[i*(i-1)/2]=i;
    ll a,b,c,d;
    cin>>a>>b>>c>>d;
    if(a==0&&b==0&&c==0&&d==0)
    {
        cout<<"0"<<endl;
        return 0;
    }
    ll aa=ans[a],dd=ans[d];
    if(ans[a]==0||ans[d]==0)
    {
        cout<<"Impossible"<<endl;
        return 0;
    }
    if(b==0&&c==0)
    {
        if(a==0&&d!=0)cout<<string(dd,'1')<<endl;
        else if(a!=0&&d==0)cout<<string(aa,'0')<<endl;
        else if(a!=0&&d!=0)cout<<"Impossible"<<endl;
        return 0;
    }
    if(aa*dd!=c+b)
    {
        cout<<"Impossible"<<endl;
        return 0;
    }
    string s=string(dd,'1');
    int p=b/dd;
    b-=p*dd;
    s=string(p,'0')+s;
    p=c/dd;
    c-=p*dd;
    s=s+string(p,'0');
    if(c==0&&b==0)
    {
        cout<<s<<endl;
        return 0;
    }
    int one=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='1')one++;
        if(one==c)
        {
          //  cout<<i<<endl;
            s=s.substr(0,i+1)+'0'+s.substr(i+1,s.size());
            break;
        }
    }
    cout<<s<<endl;
    return 0;
}
/********************
1 2 2 1
ans[2]=1,
********************/
D
原文地址:https://www.cnblogs.com/acjiumeng/p/7413598.html