結果
| 問題 |
No.204 ゴールデン・ウィーク(2)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2016-08-17 00:52:49 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 1,000 ms |
| コード長 | 1,911 bytes |
| コンパイル時間 | 496 ms |
| コンパイル使用メモリ | 58,648 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-12-24 11:56:34 |
| 合計ジャッジ時間 | 1,924 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 |
ソースコード
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
int main(){
int flag,num=0,count=1,D;
//std::vector<int> c[13];
int c[13]={};
char a,memo;
int result=0;
cin >> D;//Dの入力
cin >> a;//初期入力を確保
memo = a;
(a=='o')?(flag = 1):(flag = 0);//初期入力が休日ならフラグ立つ
for (size_t i = 1; i < 14; i++) {
cin >> a;
//入力した文字が前に入力した文字と一致すれば、この文字の連続回数を数える。
if(a == memo)count = count + 1;
else{//一致しなければ連続回数を保存
c[num]=count;
count = 1;
num = num + 1;
memo = a;
}
}
c[num]=count;
num = num+1;
//得られた数列を操作する。//まずはその一番前後の数字とDの足し算の大きい方を暫定解とする
//平日の日数がもしD以下なら、その平日の数字と自分の一個前と一個後ろの休日と和をとる
//そうでなければ、Dはその平日の前とその平日の後ろの休日の大きい方と和をとる
//得られた和の中、一番大きいのを選んで出力。
if(flag == 1) result = D+c[0];
else result = D+c[1];
if(num >1){
if((num-flag)%2==0){
if(result < D+c[num-1])result = D+c[num-1];
}
else{
if(result < D+c[num-2])result = D+c[num-2];
}
}
for (size_t i = flag; i < num; i=i+2) {//全ては平日の操作になる
if(c[i]<=D){
count = c[i];
(i==0)?(0):(count = count + c[i-1]);
(i==13)?(0):(count = count + c[i+1]);
}
else{
//ここでflag使わないので、変数として使わせていただきます
(i==0)?(flag = 0):(flag = c[i-1]);
(i==13)?(count = 0):(count = c[i+1]);
(count > flag)?(0):(count = flag);
count = count + D;
}
if(count > result) result = count;
}
cout << result << endl;
}