比赛链接:ABC337
日常签到题。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int cnt1=0,cnt2=0;
for(int i=1;i<n;i++){
int x1,x2;
cin>>x1>>x2;
cnt1+=x1;
cnt2+=x2;
}
if(cnt1>cnt2)
cout<<"Takahashi"<<endl;
else if(cnt1<cnt2)
cout<<"Aoki"<<endl;
else
cout<<"Draw"<<endl;
return 0;
}
其实就挨这个找,只要有一位不对劲了就输NO。你一看代码就知道了。
#include <bits/stdc++.h>
using namespace std;
int main(){
string str;
cin>>str;
for(int i=0;i<str.size();i++){
if((str[i-1]=='C' && str[i]=='A') || (str[i-1]=='C' && str[i]=='B') || (str[i-1]=='B' && str[i]=='A')){
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
return 0;
}
给一个比较巧(个人向)的方法。我们用一个数组记录后面是谁,再用一个begin记录排头。然后我们就可以这样输出:
for(int i=begin;i!=0;i=behind[i])
cout<<i<<' ';
怎么样,不错吧。所以完整代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[maxn],behind[maxn];
int main(){
int n;
cin>>n;
int begin=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==-1){
begin=i;
continue;
}
behind[a[i]]=i;
}
for(int i=begin;i!=0;i=behind[i])
cout<<i<<' ';
return 0;
}
大概就是用一个滑动窗口找就可以了。看代码吧。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int cnt1[maxn],cnt2[maxn];//cnt1是'x'的前缀和,cnt2是' '的前缀和
int main(){
int h,w,k;
cin>>h>>w>>k;
vector<vector<int>> grid(h+1,vector<int>(w+1));
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
char ch;
cin>>ch;
if(ch=='x')
grid[i][j]=0;
else if(ch=='.')
grid[i][j]=1;
else
grid[i][j]=2;
}
}
int res=INT_MAX;
for(int i=1;i<=h;i++){//横
for(int j=1;j<=w;j++){
cnt1[j]=cnt1[j-1]+(grid[i][j]==0);
cnt2[j]=cnt2[j-1]+(grid[i][j]==2);
}
for(int j=k;j<=w;j++){
if(cnt1[j]-cnt1[j-k]==0)
res=min(res,k-cnt2[j]+cnt2[j-k]);
}
}
//请读者自行补全代码(竖着找的部分)
if(res==INT_MAX)
cout<<-1<<endl;
else
cout<<res<<endl;
return 0;
}
OK,以上就是本期的全部内容了。我们下期再见!
温馨提示:本期的所有代码直接提交均无法AC,请不要无脑Ctrl C+Ctrl V