CodeForces 1150B
思路:数据量不大,爆搜即可,注意每次都是从十字架的最上方一点开始搜
AC代码:
#include<bits/stdc++.h>
using namespace std;
char mp[55][55];
int vis[55][55];
int n;
bool judge(int x,int y){
//cout<<x+2<<" "<<y-1<<" "<<y+1<<" "<<mp[x+1][y]<<mp[x+2][y]<<mp[x+1][y-1]<<mp[x+1][y+1]<<vis[x+1][y]<<vis[x+2][y]<<vis[x+1][y-1]<<vis[x+1][y+1]<<endl;
if(x+2<=n && y-1>0 && y+1<=n && mp[x+1][y]=='.' && mp[x+2][y]=='.' && mp[x+1][y-1]=='.' && mp[x+1][y+1]=='.'
&& vis[x+1][y]==0 && vis[x+2][y]==0 && vis[x+1][y-1]==0 && vis[x+1][y+1]==0){
vis[x+1][y]=1; vis[x+2][y]=1; vis[x+1][y-1]=1; vis[x+1][y+1]=1;
return true;
}
}
return false;
}
int main(){
cin>>n;
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}getchar();
}
int flag = 1;
// for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++) vis[i][j]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]=='.' && vis[i][j]==0){
vis[i][j]=1;
if(!judge(i,j)) flag = 0;
}
}
}
if(flag) cout<<"YES";
else cout<<"NO";
return 0;
}
CodeForces 1332D
题意:找出一个矩阵,是Bob方法的输出与真正正确的输出相差为输入的k
思路:试着构建一个矩阵,按Bob的输出为0,正确的输出为k,即符合题意,一大重点就是最后的一位数为k,上方为0,左侧为k的二进制取反前在加1,以此再推出一个2x3的矩阵即满足题意
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int k;
cin>>k;
if(k==0) cout<<1<<" "<<1<<endl<<300000<<endl;
else{
int x = k;
string s;
while(x!=0){
if(x%2) s += "1";
else s += "0";
x/=2;
}
//cout<<s<<endl;
string s1 = s+"1";
string s2;
for(int i=0;i<s.size();i++){
if(s[i]=='0') s2 += "1";
else s2 += "0";
}
s2 += "1";
int a=0,b=0 ;
for(int i=0;i<s1.size();i++) if(s1[i]=='1') a += pow(2,i);
for(int i=0;i<s2.size();i++) if(s2[i]=='1') b += pow(2,i);
cout<<2<<" "<<3<<endl;
cout<<a<<" "<<k<<" "<<0<<endl;
cout<<b<<" "<<a<<" "<<k<<endl;
}
return 0;
}
AtCoder arc134_b
题意:成对的一个数组x,按其对一个字符串对应的位置的字符交换,问字典序最小的输出结果
思路:用二维vector数组记录每个字符在字符串中出现的位置,在处理边界条件之后对字符串进行处理
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
string s;
cin>>s;
vector ch(26,vector<int>());
for(int i=0;i<n;i++){
ch[(int)(s[i]-'a')].push_back(i);
}
int i=0,j=n-1;
while(i<j){
int x = 0;
while(x<26){
while(!ch[x].empty() && ch[x].back()>j) ch[x].pop_back();
if(ch[x].empty() || ch[x].back()<i) x++;
else break;
}
if(s[i]<='a'+x){
i++;
continue;
}
j = ch[x].back();
swap(s[i],s[j]);
i++;j--;
}
cout<<s<<endl;
return 0;
}
AtCoder abc278_d
思路:用一个queue储存x,然后分情况操作数组元素即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MA = 9999999999;
int N;
int arr[200005];
int vis[200005];
queue<int> gai;
int Q;
int a,b,c;
int ty = MA;
signed main(){
cin>>N;
for(int i=1;i<=N;i++) cin>>arr[i];
cin>>Q;
while(Q--){
cin>>a>>b;
if(a==1){
ty=b;
while(!gai.empty()){
vis[gai.front()]=0;
gai.pop();
}
}
else if(a==2){
cin>>c;
if(ty==MA) arr[b]+=c;
else if(vis[b]==0 && ty!=MA){
vis[b]=1;
gai.push(b);
arr[b]=ty+c;
}
else if(ty!=MA && vis[b]==1){
arr[b]+=c;
}
}
else if(a==3){
if(vis[b]==0 && ty==MA) cout<<arr[b]<<endl;
else if(vis[b]==0 && ty!=MA) cout<<ty<<endl;
else if(vis[b]==1 && ty!=MA) cout<<arr[b]<<endl;
}
}
return 0;
}