[atcoder] agc86 D - Non-decreasing
3176 ワード
D - Non-decreasing
タイトルリンク:Non-decreasing
テーマ:
長さn(1≦n≦50)のシーケンスを与えた.毎回2つの数ax,ayを選択し,ayにaxを加算することができる.最終的にaシーケンスが低下しないようにし,問題は0 2 n回の解を保証する.操作個数および操作スキームを出力します.
データ範囲:
1≤n≤50 −106≤ai≤106
問題解決の考え方:
この問題は試合中に思いつかなかった.C問題は5分で書き終わったら電話を切った.の試合が終わった後、別のコードを見て一瞬理解した.実はこの問題aiが正数か負の数であれば、左から右へまたは右から左へ1回加算、すなわちn-1回操作すれば条件に合致すると考えられる.しかし、現在は正負があり、絶対値の最大数を記録するだけで、このn個の数にこの絶対値の最大数を加えると、彼らは記号が統一され、この操作はn回なので、2 n回で必ず解があることを保証することができる.
ACコード:
タイトルリンク:Non-decreasing
テーマ:
長さn(1≦n≦50)のシーケンスを与えた.毎回2つの数ax,ayを選択し,ayにaxを加算することができる.最終的にaシーケンスが低下しないようにし,問題は0 2 n回の解を保証する.操作個数および操作スキームを出力します.
データ範囲:
1≤n≤50 −106≤ai≤106
問題解決の考え方:
この問題は試合中に思いつかなかった.C問題は5分で書き終わったら電話を切った.の試合が終わった後、別のコードを見て一瞬理解した.実はこの問題aiが正数か負の数であれば、左から右へまたは右から左へ1回加算、すなわちn-1回操作すれば条件に合致すると考えられる.しかし、現在は正負があり、絶対値の最大数を記録するだけで、このn個の数にこの絶対値の最大数を加えると、彼らは記号が統一され、この操作はn回なので、2 n回で必ず解があることを保証することができる.
ACコード:
/********************************************
*Author* :ZZZZone
*Created Time* : 12/11 20:46:20 2017
* Ended Time* : 12/11 21:04:29 2017
*********************************************/
#include
#include
#include
#include
#include
#include
using namespace std;
int n;
int a[55];
int main(){
scanf("%d", &n);
int p = 0;
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
if(abs(a[i]) >= abs(a[p])) p = i;
}
printf("%d
", 2 * n - 1);
for(int i = 1; i <= n; i++) printf("%d %d
", p, i);
if(a[p] > 0) for(int i = 1; i < n; i++) printf("%d %d
", i, i + 1);
else for(int i = n; i > 1; i--) printf("%d %d
", i, i - 1);
return 0;
}