[アルゴリズム] テープ番号のゲーム – Linegate
リンク推奨:vn.spoj.com/problems/LINEGAME/
スレッド:
長方形のバンドを右から開始する左から番号n個の正方形に分割されているがあります 1. i番目の広場に1は、正の整数のいずれかを指摘します, I = 1,2、…,N. 1回で, 参加者は、氷上での細胞の任意の数を選択することができます。. 左から右への順序であるとし, プレイヤーは、細胞のI1を選択, i2は、…, 私. その後、そのプレイヤーのスコアを達成:
リクエスト: 1演劇から達成ポイントの最大数を計算します.
データ:
- 最初の行は整数nが含まれています ( N≤ 106 ) テープの細胞数;
- 2行目は、正の整数nを含んでいます1, ザ·2, …, ザ·N ( ザ·で ≤ 104, I = 1, 2, …, N ) テープ番号に記録. 一番上の行の連続番号は、少なくとも1つのスペースで区切られて.
結果:
- 単一の番号がポイントの最大数は1プレーから達成することができています.
例:
データ | 結果 |
---|---|
7 4 9 2 4 1 3 7 |
17 |
アイデア:(自然のアイデアは、参照してください, 唯一のあなたのコードの実行 80 ポイント)
述べたように最大の交流の総効果は、我々はすべてを開始したことを私たちが最大のポイントと最低のポイントを見つけるための方法を使用するように設定することを選択することができるようにするには, 合計最大のポイントを取るマイナス最小点の合計が結果が見つけると心に留めておく必要があるということですと、最初と最後であれば最低点を取っていません (ただ最大の退職を取得します). 具体的には、後に示すように:
#include <cstdio> #include <cstdlib> #include <fstream> #include <iostream> #define INP "LINEGAME.INP" #define OUT "LINEGAME.OUT" using namespace std; int main() { ifstream inp(INP); ofstream out(OUT); int n = 0; cin >> n; if (n==1){ //cout << "n = 1"; cin >> n; cout << n; return 0; } int* a = (int *) malloc(n * sizeof(int)); //cout << n; for (int i = 0; i < n; i++) { cin >> a[i]; //cout << a[i] << " "; } //cout << endl; long sum = 0; int min = 0; for (int j = 0; j < n; j++) { // tim diem cuc dai if (j < n) { sum -= min; // tru di diem cuc tieu truoc do // cout << sum << " = " << "sum - " << min << endl; while (j < n - 1 && a[j] < a[j + 1]) { j++; } sum += a[j]; // cong diem cuc dai vao // cout << sum << " = " << "sum + " << a[j] << endl; } // tim diem cuc tieu, khong lay diem cuoi cung if (j < n - 1) { while (j < n - 1 && a[j] > a[j + 1]) { j++; } min = a[j]; // ghi lai de neu co cuc dai thi moi tru } } cout << sum <<endl; return 0; }
また、あなたはあなたの参照を依頼する必要がと行っています 100 ポイント, このようなNOIあなたはまだ理解していません:
コールD0[で] 選択します[で] かとTRCを設定プラスD1それを呼び出します[で] kが選択または選択されます[で] マイナスに設定します
D1[で]:=最大(D1[iは、1],D0[iは、1]-ザ·[で]);
D0[で]:=最大(D1[iは、1]+ザ·[で],D0[iは、1]);
あなたは私のアルゴリズムKO先生についての詳細を教えてもらえます
なぜ図に示すようなグラフを描きます
それはシリアル番号ですので、写真のチャートであります. パートアイデアは、私はあなたを得たと述べました.