Codeforces Round #829 (Div. 2)

A - Technical Support

题意:给定一个字符串含有Q、A,Q意味着询问,A意味着回答,回答不一定是立即反馈且唯一,一个问题会有多个回答,试分析,该字符串中的所有Q是否被回答。

思路:当A大于Q时清空q和A,最后看Q有没有多余

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define endl "\n"
#define debug freopen("C:/Users/HBH/Desktop/1.txt","w",stdout);
ll n,t;
int main()
{
   cin>>t;
   while(t--)
   {
       cin>>n;
       string str;
       cin>>str;
       ll a=0,b=0;
       ll flag=1;
       for(int i=0;i<str.size();i++)
       {
           if(str[i]=='Q'){a-=b;if(a<0)a=0;b=0;a++;}
           else b++;
       }
       
       if(a>b)flag=0;
       if(flag)cout<<"Yes"<<endl;
       else cout<<"No"<<endl;

   }
}

B - Kevin and Permutation

题意:给定n,重组1~n序列,使得相邻两数差的最小值最大

思路:分类讨论,如果n为奇数,则52431这样排。如果为偶数,则2413,也就是n/2放前面,这样就能保证差值大约为n/2

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define endl "\n"
#define debug freopen("C:/Users/HBH/Desktop/1.txt","w",stdout);
ll n,t;
int main()
{
   cin>>t;
   while(t--)
   {
       cin>>n;
       ll r=n;
       ll l=n/2;
       ll flag=0;
       while(l>=1&&r>n/2)
       {
           if(flag)cout<<" ";
           if(n&1)
           cout<<r<<" "<<l;
       else cout<<l<<" "<<r;
           flag=1;
           l--;r--;
       }
       if(r>n/2)
           cout<<" "<<r<<endl;
       else cout<<endl;

   }
}

C1 - Make Nonzero Sum (easy version)

题意:给定n个1 -1的序列,按照a1-a2+a3-a4......相加,可以分块使得分块内部加减规则和整体一样,例如从a2开始分块,则整体和为a1-(a2-a3+a4)......,问分多少段可以使得总体和为0

思路:两个两个判断,如果两个数相加为0,则这两个数分为两段计算,否则当作一段计算

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define endl "\n"
#define debug freopen("C:/Users/HBH/Desktop/1.txt","w",stdout);
ll n, t;vector<ll>sum;

int main()
{
    cin >> t;
    while (t--)
    {
        cin >> n;
        vector<ll>num;
        
        ll s=0;
        for (int i = 0; i < n; i++)
        {
            ll nn;
            cin>>nn;
            num.push_back(nn);
        }
        if(n&1)
        {
            cout<<"-1"<<endl;
            continue;
        }
        vector<ll>ans;
        for(int i=1;i<n;i+=2)
        {
            if(num[i-1]==-1&&num[i]==1)
            {
                ans.push_back(i-1);
                ans.push_back(i-1);
                ans.push_back(i);
                ans.push_back(i);
            }
            else if(num[i-1]==1&&num[i]==-1)
            {
                ans.push_back(i-1);
                ans.push_back(i-1);
                ans.push_back(i);
                ans.push_back(i);

            }
            else if(num[i-1]+num[i]==2||num[i-1]+num[i]==-2)
            {
                ans.push_back(i-1);
                ans.push_back(i);
            }
            
        }
        cout<<ans.size()/2<<endl;
        for(ll i=1;i<ans.size();i+=2)
        {
            cout<<ans[i-1]+1<<" "<<ans[i]+1<<endl;
        }
        

    }
}

C2 - Make Nonzero Sum (hard version)

和c1比就多了一个0的种类,那么我们就多判断一下,将0和最前面的1当成一块,然后按照c1判断即可,比如10000 -1,那么把10000看成c1中的1来处理即可,然后还得判断前缀0,之间分块即可,如果是10001或者-1 000 -1,那么就右边的数带一个0然后分块

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define endl "\n"
#define debug freopen("C:/Users/HBH/Desktop/1.txt","w",stdout);
ll n, t; vector<ll>sum;

int main()
{
    cin >> t;
    while (t--)
    {
        cin >> n;
        vector<ll>num;

        ll s = 0;
        for (int i = 0; i < n; i++)
        {
            ll nn;
            cin >> nn;
            if (abs(nn) == 1)s++;
            num.push_back(nn);
        }
        if (s & 1)
        {
            cout << "-1" << endl; continue;
        }
        if (s == 0)
        {
            cout << 1 << endl;
            cout << "1 " << n << endl;
            continue;
        }
        vector<ll>ans;
        ll l = 0;
        ll r = 1;
        while(num[l]==0&&l<n)
        {
            ans.push_back(l);
                ans.push_back(l);
                l++;
        }
        r=l+1;
        while (r < n)
        {

            if (num[r] == 0)
            {
                r++;
                continue;
            }
            if (num[l] + num[r] == 0)
            {
                ans.push_back(l);
                ans.push_back(r - 1);
                ans.push_back(r);
                ans.push_back(r);
            }
            else if (abs(num[l] + num[r]) == 2)
            {
                if (r - l + 1 >= 3)
                {
                    ans.push_back(l);
                    ans.push_back(r - 2);
                    ans.push_back(r - 1);
                    ans.push_back(r);
                }
                else
                {
                    ans.push_back(l);
                    ans.push_back(r);
                }
            }
            l = r + 1;
            while (num[l] == 0 && l < n)
            {
                ans.push_back(l);
                ans.push_back(l);
                l++;
            }
            r = l + 1;
        }
        cout << ans.size() / 2 << endl;
        for (int i = 1; i < ans.size(); i += 2)
        {
            cout << ans[i - 1] + 1 << " " << ans[i] + 1 << endl;
        }


    }
}

 

posted @ 2022-10-25 22:45  hbhhbh  阅读(21)  评论(0)    收藏  举报