読者です 読者をやめる 読者になる 読者になる

beet's soil

競プロのことなど

AtCoder Grand Contest 006

MBAのアプデをしたらg++が死んでしまって大変だった。
全部コードテストでデバッグすることになってつらかった。


【A - Prefix and Suffix】
同じような問題を部活でやっていたのに同じミスをしたのでアレ。
くっつけるだけ。

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n,i,j,ans=0;
  string a,b;
  cin>>n>>a>>b;
  ans=n*2;
  for(i=0;i<n;i++){
    bool f=true;
    for(j=0;i+j<n;j++){
      if(a[i+j]!=b[j]) f=false;
    }
    if(f) ans=min(ans,n+i);
  }
  
  cout << ans << endl;
  return 0;
}

【B - Median Pyramid Easy】
400は絶対嘘(※個人の感想です)。
全然わかんなかったので

#include<bits/stdc++.h>
using namespace std;
int med(int a,int b,int c){
  int x[3]={a,b,c};
  //cout << a << b << c << endl;
  sort(x,x+3);
  //cout << x[0] << x[1] << x[2] << endl;
  return x[1];
}
int main(){
  vector<int> v;
  map<int,vector<int> > m;
  int n,i,j,N;
  cin>>n;N=2*n-1;
  v.resize(N);
  for(i=0;i<N;i++) v[i]=i+1;
  int dp[2][N];
  memset(dp,0,sizeof(dp));
  do{
    for(i=0;i<N;i++) dp[0][i]=v[i];//,cout << dp[0][i] << " ";
    //cout << endl;
    for(i=0;i<n;i++){
      for(j=i+1;j<N-1-i;j++){
	dp[(i+1)%2][j]=med(dp[i%2][j-1],dp[i%2][j],dp[i%2][j+1]);
	if(i==n-2&&m.find(dp[(i+1)%2][j])==m.end()) m[dp[(i+1)%2][j]]=v;
      }
    }
  }while(next_permutation(v.begin(),v.end()));
  for(auto it=m.begin();it!=m.end();++it) {
    cout << it->first << endl;
    v=it->second;
    for(i=0;i<v.size();i++) cout << v[i] ;
    cout << endl;
  }
  return 0;
}

こういうのを書いて

5
2
345126789
3
145236789
4
125346789
5
123456789
6
123467589
7
123478569
8
123489567

みたいになったので何も考えずに見たまま実装する。

#include<bits/stdc++.h>
using namespace std;
int main(){
  int n,x,i;cin>>n>>x;
  if(abs(n-x)<n-1){
    cout << "Yes" << endl;
    if(x<n){
      for(i=0;i<x-2;i++) cout << i+1 << endl;
      for(i=x;i<n;i++) cout << i+1 << endl;
      for(i=x-2;i<x;i++) cout << i+1 << endl;
      for(i=n;i<2*n-1;i++) cout << i+1 << endl;
    }
    if(x>n){
      for(i=0;i<n-1;i++) cout << i+1 << endl;
      for(i=x-1;i<x+1;i++) cout << i+1 << endl;
      for(i=n-1;i<x-1;i++) cout << i+1 << endl;
      for(i=x+1;i<2*n-1;i++) cout << i+1 << endl;
    }
    if(x==n){
      for(int i=1;i<2*n;i++){
	cout << i << endl;
      }
    }
  }else{
    cout << "No" << endl;
  }
  return 0;
}

解説を見て考察の重要性を感じた(KONAMI

【全体】
1833->1815(-18)
コードが上がらなくなってきた。
AOJ埋めとコンテスト参加を積極的にしたい。