Codeforces #449 Div2 D
阿新 • • 發佈:2017-12-06
可選 保持 include blog 觀察 space 改變 ceil 個數字 的數字我們從左往右放,否則從右往左放,且保持數字一直有序。考慮最壞的情況,若依次給出數字 \([\left \lceil \frac{c}{2} \right \rceil, c]\) ,我們都只能填到最右邊的紙上,需要改變 \(\left \lceil \frac{c}{2} \right \rceil\) 次,其它紙類似。所以對於題目所給出的數據範圍我們的貪心策略是有效的。
#449 Div2 D
題意
交互式類題目。
起始有 n 張紙,會給出 m 次數字 p (\(1 \leq p \leq c\)),每次可選擇一張紙,並在紙上寫上這個數字,如果紙上已經存在數字,會覆蓋掉原來的數字。問不超過 m 次能否使得所有紙上都有數字且不降序排列。
分析
這類想法題挺常見的了,觀察數據範圍 $ \left \lceil \frac{c}{2} \right \rceil \cdot n \leq m$,我們可以這麽理解, \(n\) 張紙,每張最多變 $ \left \lceil \frac{c}{2} \right \rceil $ 次。
考慮對於小於 \(\left \lceil \frac{c}{2} \right \rceil\)
code
#include<bits/stdc++.h>
using namespace std;
int a[1111];
int main() {
int n, m, c;
cin >> n >> m >> c;
int cnt = 0;
c = c / 2;
while(1) {
int p, pos;
cin >> p;
if(p <= c) {
for(int i = 1; i <= n; i++) {
if(!a[i] || a[i] > p) {
if(!a[i]) cnt++;
a[i] = p;
pos = i;
break ;
}
}
} else {
for(int i = n; i >= 1; i--) {
if(!a[i] || a[i] < p) {
if(!a[i]) cnt++;
a[i] = p;
pos = i;
break;
}
}
}
cout << pos << endl;
fflush(stdout);
if(cnt == n) break;
}
return 0;
}
Codeforces #449 Div2 D