ド素人のメモ帳

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

Codeforces#143

A. Team

■問題
3つの0か1がn個与えられて、1が2つ以上あるものが何個あるか求めよ。


■解法
数えるだけ


■ソース

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main(void)
{
  int n;
  cin >> n;
  int ret = 0;
  for(int i = 0; i < n; i++){
    int c = 0;
    for(int j = 0; j < 3; j++){
      int a;
      cin >> a;
      if(a) c++;
    }
    if(c >= 2) ret++;
  }
  cout << ret << endl;
}

B. Magic, Wizardry and Wonders

■問題
最後の2つの値をそれを減算した値に置き換えてを繰り返し要素が1つになったときその値がdになるようなn個の要素からなる数列を出力せよ


■解法
dp[幾つ目か][必要な差はいくつか]で無理やりdpした。
奇数項 - 偶数項 = dなんて頭いいこと時間内に思いつかなかった。


■ソース

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;

int n,d,l;
int use[111];

int dp[111][22222];

int solve(int i,int m){
  if(dp[i][m + 10000] >= 0){
    return dp[i][m + 10000];
  }  

  if(i == n){
    return (m == 0)?1:0;
  }

  for(int j = 1; j <= l; j++){
    if(abs(j - m) >= l * n) continue;
    if(solve(i + 1, j - m)){
      use[i] = j;
      return dp[i][m + 10000] = 1;
    }
  }
  return dp[i][m + 10000] = 0;
}

int main(void)
{
  cin >> n >> d >> l;
  memset(dp,-1,sizeof(dp));
  if(solve(0,d)){
    for(int i = 0; i < n; i++){
      cout << use[i] << ((i == n - 1)?'\n':' ');
    }
  }else{
    cout << -1 << endl;
  }
}