left 3 Codeforces Round 913 (Div. 3)
A.
把同行同列除了起点都输出即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
char c;int a;cin>>c>>a;
for(int i=1;i<=8;i++){
if(i==a)continue;
cout<<c<<i<<'\n';
}
for(int i=0;i<8;i++){
if((char)('a'+i)==c)continue;
cout<<(char)('a'+i)<<a<<'\n';
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
B.
把大小写字母分开存储,同时记录输入顺序id
处理完后按输入顺序输出
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
string s;cin>>s;
vector<pair<int,char>>sm,bi;
for(int i=0;i<s.size();i++){
if(s[i]=='b'){
if(sm.size())sm.pop_back();
}else if(s[i]=='B'){
if(bi.size())bi.pop_back();
}else if(s[i]>='a'&&s[i]<='z')sm.push_back({i,s[i]});
else bi.push_back({i,s[i]});
}
for(auto tmp:sm){
bi.push_back(tmp);
}
sort(bi.begin(),bi.end());
for(auto tmp:bi){
cout<<tmp.second;
}
cout<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
C.
其实可以简单地看成两部分,因为颜色越多会更优
我们就考虑两种颜色,若最多数量的颜色小等于一半,说明一定可以和其他颜色配对
注意奇偶数,只能偶数个消
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n;cin>>n;
string s;cin>>s;
vector<pair<int,int>>a(26);
for(int i=0;i<26;i++)a[i].second=i;
for(int i=0;i<s.size();i++){
a[s[i]-'a'].first++;
}
sort(a.begin(),a.end(),greater<pair<int,int>>());
int ma_cnt=a[0].first;
int sum=0;
for(int i=0;i<26;i++)sum+=a[i].first;
if(ma_cnt<=sum/2){
if(sum%2==0){
cout<<0<<'\n';return ;
}else {
cout<<1<<'\n';return ;
}
}else cout<<sum-2*(sum-ma_cnt)<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
D.
二分
先算出现在所能跳的最左边和最右边的值
判能否跳到第i条线段
然后更新到第i条线段的范围
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n;cin>>n;
vector<pair<int,int>>v(n+1);
for(int i=1;i<=n;i++)cin>>v[i].first>>v[i].second;
int l=0,r=1e9,mid;
int ans=1e9;
while(l<=r){
mid=(l+r)/2;
int tl=0,tr=0;
bool f=0;
for(int i=1;i<=n;i++){
tl-=mid;tr+=mid;
if(tl<=v[i].second&&tr>=v[i].first){
tl=max(tl,v[i].first);tr=min(tr,v[i].second);
}else{
f=1;
break;
}
}
if(f)l=mid+1;
else {
r=mid-1;
ans=min(ans,mid);
}
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
E.
举个例子:
9+0+1=10
9+0+1 != 1+0
所以每个数位不能产生进位
那么每个数位就是独立的
枚举每个数位3个数能取哪些值,再全部乘起来
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int get(int x){
int ans=0;
for(int i=0;i<=x;i++){
for(int j=0;j<=x;j++){
for(int k=0;i+j+k<=x;k++){
if(i+j+k==x) {
ans++;
// cout<<i<<' '<<j <<' '<<k<<'\n';
}
}
}
}
return ans;
}
void solve() {
int n;cin>>n;
int ans=1;
while(n){
ans*=get(n%10);
n/=10;
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
F.
要求不降序排列,那么只有一种排列情况
必须要处理直到特定排列顺序
而翻转时机不会影响最优解
往前放也不会改变数字的相对顺序
所以要求本来就是非降序排列,只是起点未知
所以两种情况:
1.直接往前放
2.先翻转,再往前放
把逆时针排列的先翻转一次成顺时针排列,省代码
然后按照顺时针排列的处理
但注意第一种情况的计数+1,因为翻转了一次
第2种情况计数-1,因为与第一次翻转抵消(第一次翻转后变回原串)
debug:
判排列的时候,第一个最小值前面一定是最大值
把这个优化加上才可以过,否则超时
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n;cin>>n;
vector<int>a(n);
int mi=1e9,ma=-1;
bool su=0;
for(int i=0;i<n;i++){
cin>>a[i];
mi=min(mi,a[i]);
ma=max(ma,a[i]);
if(i>0){
if(a[i]>=a[i-1])continue;
su=1;
}
// cout<<mi<<' '<<a[i]<<'\n';
}
if(su==0){
cout<<0<<'\n';return ;
}
bool f=0;
int l;
int ans1=1e9;
for(int i=0;i<n;i++){
if(a[i]==mi&&a[(i-1+n)%n]==ma){
f=0;
l=i;
for(int j=i+1;j<n;j++){
if(a[j]>=a[j-1])continue;
f=1;break;
}
if(f==0){
for(int j=0;j<l;j++){
if(j==0){
if(a[j]>=a[n-1])continue;
f=1;break;
}else{
if(a[j]>=a[j-1])continue;
f=1;break;
}
}
}
if(!f){
ans1=min({ans1,n-l,l+2});
// cout<<"ans1="<<ans1<<' '<<"l="<<l<< '\n';
break;
}
}
}
reverse(a.begin(),a.end());
// cout<<"mi="<<mi<<'\n';
su=0;
for(int i=1;i<n;i++){
if(a[i]>a[i-1])continue;
su=1;break;
}
if(su==0){
cout<<1<<'\n';
return ;
}
for(int i=0;i<n;i++){
if(a[i]==mi&&a[(i-1+n)%n]==ma){
f=0;
l=i;
// cout<<"mi="<<mi<<' '<<"l="<<l<<'\n';
for(int j=i+1;j<n;j++){
if(a[j]>=a[j-1]){
// cout<<"j="<<j<<' '<<"j-1="<<j-1<<'\n';
continue;
}
f=1;break;
}
if(f==0){
for(int j=0;j<l;j++){
if(j==0){
if(a[j]>=a[n-1]){
// cout<<"j="<<j<<' '<<"n-1="<<n-1<<'\n';
continue;
}
f=1;break;
}else{
if(a[j]>=a[j-1]){
// cout<<"j="<<j<<' '<<"j-1="<<j-1<<'\n';
continue;
}
f=1;break;
}
}
}
if(!f){
ans1=min({ans1,n-l+1,l+1});
//cout<<"ans1="<<ans1<<' '<<"l="<<l<< '\n';
break;
}
}
}
if(ans1==1e9)cout<<-1<<'\n';
else cout<<ans1<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}