ド素人のメモ帳

解いた問題のプログラムとか載せてくと思います。

AtCoder007

A - 帰ってきた器物損壊!高橋君

■問題
破壊した文字と文字列が与えられて、文字列から破壊されたものを取り除いた文字列を出力する。


■解法
やるだけ


■ソース

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
  char x;
  string s;
  cin >> x >> s;
  for(int i=0;i<s.size();i++){
    if(x!=s[i])cout << s[i];
  }
  puts("");
}

B - 迷子のCDケース

■問題
n個のケースに入ったCDと1個のケースがないCDがあり、入力されたCDとケース無しのCDを交換したあとのケースの状態を求めろ


■解法
入力通り入れ替えするだけ
やるだけ


■ソース

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
  int n,m;
  int cd[111];
  cin >> n >> m;
  for(int i=1;i<=n;i++){
    cd[i] = i;
  }
  cd[0]=0;
  for(int i=0;i<m;i++){
    int d,id,j;
    cin >> d;
    for(j=0;j<=n;j++){
      if(cd[j] == d) break;
    }
    cd[j] = cd[0];
    cd[0] = d;
  }
  for(int i=1;i<=n;i++){
    cout << cd[i] << endl;
  }
}

C - 節約生活

■問題
視聴できる時間を表した文字列が与えられます。
幾つかのテレビを時間をずらして付けていつでも視聴できるような状態を作るとき必要なテレビの最小の数を求めなさい。


■解法
0分~データの個数分までの間はパターンが繰り返されているのでテレビをつける必要はない。
データ量+1~データ量*2分の間で全て視聴できればそれ以降も全て視聴できるといえる。
後は、テレビの付け方を全通り試せば答えを求めることができる。


■ソース

#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;

string w;
int watch[22];

int solve(int m){
  int i;
  for(i=m;i<w.size()*2;i++){
    if(!watch[i])break;
  }
  if(i==w.size()*2){
    return 0;
  }

  int ret =111;

  for(int i=m;i<w.size();i++){
    queue<int> que;

    for(int j=i,k=0;j<w.size()*2;j++,k++){
      k %= w.size();
      if(w[k]=='o' && !watch[j] ){
	watch[j]=1;
	que.push(j);
      }
    }

    ret = min(ret,solve(i+1)+1);

    int s = que.size();
    for(int j=0;j<s;j++){
      int q = que.front();que.pop();
      watch[q] = 0;
    }

  }
  return ret;
}

int main()
{
  cin >> w;
  cout << solve(0) << endl;
}