0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ABC050 ARC066 の問題を解いてみました

Last updated at Posted at 2024-01-01

A問題

if文で足し算か引き算かを判断して、結果を出力します。

#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int a, b;
  char op;
  cin >> a >> op >> b;
  
  if(op == '+'){ //足し算なら
    cout << a + b << endl;
  }
  else{ //引き算なら
    cout << a - b << endl;
  }
}

B問題

飲むドリンクを全探索しましょう。
具体的には、選んだドリンクが効果する問題の 解く時間を変えて、
全ての時間を解くのにかかる時間を計算しましょう。

#include <bits/stdc++.h>
using namespace std;
//Created by karaju.

int main(void){
  int n;
  cin >> n;
  int t[n];
  for(int i = 0; i < n; i++) cin >> t[i];
  int m;
  cin >> m;
  int p[m], x[m];
  for(int i = 0; i < m; i++){
    cin >> p[i] >> x[i];
    p[i]--;
  }
  
  for(int i = 0; i < m; i++){ // それぞれのドリンクを試す
    int timesum = 0;
    for(int j = 0; j < n; j++){ // 実際にシミュレーション
      if(j == p[i]){ //ドリンクの効果がある問題なら
        timesum += x[i];
      }
      else{
        timesum += t[j];
      }
    }
    cout << timesum << endl;
  }
}

C問題

まずは、$N$ が偶数の時の場合について考えます。
自分の左に並んでいた人数と自分の右に並んでいた人数の差の絶対値 の並びは、
$N-1,N-3,...,3,1,1,3,...,N-3,N-1$ となるはずです。
なので、上のような並びに並び替えられない場合は、答えは 0 になります。

次に、$N$ が奇数の時の場合について考えます。
自分の左に並んでいた人数と自分の右に並んでいた人数の差の絶対値 の並びは、
$N-1,N-3,...,2,0,2,...,N-3,N-1$ となるはずです。
なので、上のような並びに並び替えられない場合は、答えは 0 になります。

そして、この問題は 元の並び方が何通りあるかを求める問題です。
並び替える方法には、同じ種類の数の前後を入れ替えるという方法があります。
$[N \div 2]$ 個 の種類の並び替えができるので、元の並び方の組み合わせは、$2^{N/2}$ と表せます。

#include <bits/stdc++.h>
using namespace std;
//Created by karaju.
const long long MOD = 1000000007;

int main(void){
  int n;
  cin >> n;
  int x[n]; //絶対値がiである人の人数 = x[i]
  for(int i = 0; i < n; i++) x[i] = 0;
  bool ok = true;
  for(int i = 0; i < n; i++){
    int a;
    cin >> a;
    // a が条件を満たしているかを確かめる
    if(n % 2 == 1){ // n が奇数なら
    
      if(a % 2 == 0){  // a が偶数なら
        //0が2つあることはありえない
        if(a == 0 && x[a] >= 1) ok = false;
        //それ以外の数も3つ以上あることはありえない
        else if(x[a] >= 2) ok = false;
        x[a]++;
      }
      else ok = false;
      
    }
    else{ // n が偶数なら
      if(a % 1 == 0){ // a が奇数なら
      //同じ数が3つ以上あることはありえない
        if(x[a] >= 2) ok = false;
        x[a]++;
      }
      else ok = false;
    }
  }
  
  if(!ok){  //条件を満たしていなかったなら
    cout << 0 << endl;
    return 0;
  }
  
  long long ans = 1;
  for(int i = 0; i < n / 2; i++){ // 2^(n/2) を計算する
    ans *= 2;
    ans %= MOD;
  }
  cout << ans << endl;
}

D問題

あとで

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?