結果
| 問題 |
No.1007 コイン集め
|
| コンテスト | |
| ユーザー |
amaridekinai
|
| 提出日時 | 2020-03-06 22:47:30 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 46 ms / 1,500 ms |
| コード長 | 1,353 bytes |
| コンパイル時間 | 1,614 ms |
| コンパイル使用メモリ | 170,204 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-14 09:13:58 |
| 合計ジャッジ時間 | 2,848 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(void){
int N,K; cin >> N >> K;
K--;
vector<int> A(N);
vector<int> S(N,0);
for(int i = 0; i < N; i++){ cin >> A[i];}
S[0] = A[0];
for(int i = 1; i < N; i++){
S[i] = S[i-1]+A[i];
}
if( A[K] == 0 ){ cout << 0 << endl; return 0;}
// おそらくA[K] == 1がコーナーケース
int left = K,right = K;
if( A[K] == 1 ){ left--; right++;}
while( left > 0 ){
if(A[left] > 1 ){ left--; continue;}
else{
if( A[left] == 1 ){ //端点含める
break;
}
else{ //A[left] == 0のとき、ここへは本来は来れない
// が、ここを端点に含めたところで総数変わらないから別に入れてしまってもいい
break;
}
}
}//while-left
while(right < N){
if(A[right] > 1 ){ right++; continue;}
else{ break;
}
}
//left~rightまでの総和が欲しい 端点含む
if( right == N ){ right--;}
int ans = 0;
if(A[K] == 1 ){
int res1 = S[right];
if(K){ res1 -= S[K-1];}
int res2 = S[K];
if(left){ res2 -= S[left-1];}
ans = max(res1,res2);
}
else{
ans = S[right];
if(left){ ans -= S[left-1];
}
}
cout << ans << endl;
return 0;
}
amaridekinai