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; } } }