#はじめに
閲覧ありがとうございます。前回同様、AtCoderさんの過去問から質問です。
#問題文
ABC162-D問題です。
#自分が立てた方針
①文字列のn文字目がR、G、Bのいずれかを判定し、Rの配列、Gの配列、Bの配列にnをpush_back
②Rの配列、Gの配列、Bの配列から1つずつ選ぶ全探索により条件に合致する組み合わせの個数を数える
#コード
C++
1#include <bits/stdc++.h> 2#include <vector> 3using namespace std; 4#define rep(i, n) for(int i = 0; i < n; ++i) 5#define ll long long 6 7int main() { 8 int n; 9 string s; 10 cin >> n >> s; 11 12 //配列の宣言 13 vector<int> r, g, b; 14 r.reserve(4000); g.reserve(4000); b.reserve(4000); 15 16 //方針①の操作 17 rep(i, n) { 18 char c = s[i]; 19 if(c == 'R') r.push_back(i); 20 else if(c == 'G') g.push_back(i); 21 else if(c == 'B') b.push_back(i); 22 } 23 24 25 int result = 0; 26 int rsize = r.size(); 27 int gsize = g.size(); 28 int bsize = b.size(); 29 30 //方針②の操作 31rep(i, rsize) { 32 rep(j, gsize) { 33 rep(k, bsize) { 34 int R = r[i]; 35 int G = g[j]; 36 int B = b[k]; 37 38 int large = max(R, max(G, B)); 39 int small = min(R, min(G, B)); 40 int medium = R + G + B - large - small; 41 42 if(large - medium != medium - small) ++result; 43 } 44 } 45 } 46 47 48 cout << result << endl; 49 return 0; 50}
#その他
テストケース1は通りましたが、2は通りませんでした。
解説生放送とは方針がちょっと違ったので、このコードの間違えを探す術がないのです(泣)
#追記・編集
5/27 19:40 !=の件を編集しました
5/27 21:11 方針②において、ijkの大小関係について編集しました
回答4件
あなたの回答
tips
プレビュー