A.每次删除两个 所以只要指定字符前面有偶数个字符就可以
#include<bits/stdc++.h>
using namespace std;
void solve(){
string s;char c;cin>>s>>c;bool ok=0;
for(int i=0;i<s.size();i++){
if((s[i]==c)&&(i%2==0))
ok=1;
}
if(ok)cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
B. 数学 首先x/a是递增函数 而x%a 是周期函数 所以他俩相加的最大值应该是r 或者周期函数的波峰+1的位置(x%a==a-1)
l
#include <bits/stdc++.h>
using namespace std;
void solve(){
//int arr[]={1,6,5,2,4,3};
//rotate(arr,arr+3,arr+6);
//for(auto x:arr)cout<<x<<" ";
long long l,r,a;cin>>l>>r>>a;
long long ans=r/a+r%a,x=r-(r%a+1);
if(x>=l)ans=max(ans,x/a+x%a);
cout<<ans<<'\n';
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
C.模拟 我们找出2*n个最小权值的点 然后把他们的坐标排序 然后两两配对 输出编号即可
#include <bits/stdc++.h>
using namespace std;
const int N=200010;
struct node{
int z,q,xh;//坐标 权值 序号
}a[N];
bool cmp1(node a,node b){
return a.q<b.q;
}
bool cmp2(node a,node b){
return a.z<b.z;
}
void solve(){
int n,m;cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].z>>a[i].q;
a[i].xh=i;
}
sort(a+1,a+1+m,cmp1);
sort(a+1,a+2*n+1,cmp2);
long long sum=0;
for(int i=1;i<=2*n;i++){
sum+=a[i].q;
}
cout<<sum<<'\n';
for(int i=1;i<=n;i++){
cout<<a[i].xh<<' '<<a[2*n-i+1].xh<<'\n';
}
cout<<'\n';
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
D. 因为只能做循环所以我们从后向前遍历 遍历要更新数组中其他数的位置
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n;cin>>n;int a[n],b[n];
for(int i=1;i<=n;i++){
int x;cin>>x;a[x]=i;
}
for(int i=n;i>=1;i--){
int c=a[i];
b[i]=c%i;
for(int j=1;j<=i;j++){
a[j]=(a[j]+i-c)%i;
}
}
for(int i=1;i<=n;i++)cout<<b[i]<<" ";
cout<<'\n';
}
int main(){
int t;cin>>t;
while(t--){
solve();
}
}
我再沾一下用stl 去循环的方法 rotate()函数的使用
//int arr[]={1,6,5,2,4,3};
//rotate(arr,arr+3,arr+6);
//for(auto x:arr)cout<<x<<" ";