A. Add Odd or Subtract Even
a等于b时输出0
a<b且b-a为奇数输出1
a>b且a-b为偶数输出1
剩下输出2
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main(){
int t;cin>>t;
while(t--){
ll a,b;cin>>a>>b;
if(a==b)cout<<0<<endl;
else if((a<b&&(b-a)%2==1)||(a>b&&(a-b)%2==0)){
cout<<1<<endl;
}
else cout<<2<<endl;
}
return 0;
}
B. WeirdSort
对每个小的连续可交换的区间进行排序
用begin和end确定区间首尾
最后检查是否有序
之前没过然后加了特判过了 代码有点乱
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int t;
int m,n;
int a[105];
int p[105];
int main(){
cin>>t;
while(t--){
memset(p,0,sizeof p);
cin>>m>>n;
for(int i=1;i<=m;i++){
cin>>a[i];
}
int end;
for(int i=1;i<=n;i++){
cin>>p[i];
}
if(m==1){
cout<<"YES"<<endl;
continue;
}
if(n==1){
if(a[p[1]]>a[p[1]+1])swap(a[p[1]],a[p[1]+1]);
bool flag=true;
int maxs=a[1];
for(int i=2;i<=m;i++){
if(a[i]<maxs){
flag=false;
break;
}
else maxs=a[i];
}//加的特判
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
continue;
}
sort(p+1,p+n+1);
int begin=p[1];
p[0]=0;
for(int i=2;i<=n;i++){
if(p[i]-p[i-1]>=2){
end=p[i-1]+1;
sort(a+begin,a+end+1);
begin=p[i];
}
if(i==n){
end=min(p[n]+1,m);
sort(a+begin,a+end+1);
}
}
bool flag=true;
int maxs=a[1];
for(int i=2;i<=m;i++){
if(a[i]<maxs){
flag=false;
break;
}
else maxs=a[i];
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
C. Perform the Combo
第 i 位使用了m-i+1次,可避免对某位重复计算
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,m,n;
int a[200005];
ll p[28];
int main(){
cin>>t;
while(t--){
memset(p,0,sizeof p);
cin>>n>>m;
string s;cin>>s;
for(int i=1;i<=m;i++)cin>>a[i];
sort(a+1,a+m+1);
int step=0;
for(int i=1;i<=m;i++){
for(int j=step;j<a[i];j++){
p[s[j]-'a']+=m-i+1;//一次加上所有次的使用
step=a[i];
}
}
for(int i=0;i<n;i++)p[s[i]-'a']++;
for(int i=0;i<26;i++)cout<<p[i]<<' ';
cout<<endl;
}
return 0;
}
D. Three Integers
枚举就完事了
需要注意的是不能枚举到10000为止
否则会过不了
测试数据
1
417 10000 10000
经评论提醒,b和c只要枚举到20000即可
a枚举的区间应为1到2a,因为若枚举到2a+1,必不如减到1为最优解,所以枚举a不超过20000,b和c也不会超过20000
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int main(){
int t;cin>>t;
while(t--){
int a,b,c;cin>>a>>b>>c;
int sum;
ll aa,bb,cc;
int mins=INF,minsa=a,minsb=b,minsc=c;
for(int i=1;i<=10000;i++){
aa=i;
for(int j=1;;j++){
bb=j*aa;
if(bb>20050)break;
for(int k=1;;k++){
cc=bb*k;
if(cc>20050)break;
sum=abs(a-aa)+abs(b-bb)+abs(c-cc);
if(sum<mins){
minsa=aa;
minsb=bb;
minsc=cc;
mins=sum;
}
}
}
}
cout<<mins<<endl;
cout<<minsa<<' '<<minsb<<' '<<minsc<<endl;
}
}