1. 程式人生 > >Codeforces #449 Div2 D

Codeforces #449 Div2 D

可選 保持 include blog 觀察 space 改變 ceil 個數字

#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\)

的數字我們從左往右放,否則從右往左放,且保持數字一直有序。考慮最壞的情況,若依次給出數字 \([\left \lceil \frac{c}{2} \right \rceil, c]\) ,我們都只能填到最右邊的紙上,需要改變 \(\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