1. 程式人生 > 實用技巧 >Codeforces Round #105 補題報告

Codeforces Round #105 補題報告

C-Terse Princess

題目大意:構造出一個數組,長度為n,滿足,比前面所有數字的和都要大的恰好為b個,比前面所有數都大(並且不比前面的數字和都大)的恰好為a個,第一個數不算。

思路:可以先構造出比前面所有數都大的數b個(1, 2, 4 ... 2^n), 最後一個數設定的比較大(比如50000 - 100),然後再構造出a個比前面大的(49001,49002...),若此時超出n個數那顯然就找不到合適的了;若不是,則後面的數為48999,48998。。。

當b=0時,直接設定一個比較大的數,後面就同上

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define
pf printf #define pq priority_queue #define sc(x) scanf("%d", &x) #define scl(x) scanf("%lld", &x) #define rep(i, s, e) for(int i = s;i <= e; ++ i) using namespace std; typedef long long ll; typedef pair<int, int> PII; int n, a, b; int f[110]; bool vis[500005]; vector<int> ans; int
main() { for(int i = 1;i <= 20; ++ i) { f[i] = 1 << (i-1); } cin >> n >> a >> b; for(int i = 1;i <= b; ++ i) { vis[f[i]] = true; ans.push_back(f[i]); } int c = 48000, cnt = 0, x = 1; // int k = c - a - 10; int t = c - 1;
if(ans.size() == 0 && a) { ans.push_back(++c); ans.push_back(233); } ans.push_back(++c); if(b == 0) cnt ++; while(cnt < a) { ans.push_back(++ c); cnt ++; } while(ans.size() < n) { if(!vis[t]) ans.push_back(t --); else { puts("-1"); return 0; } } // cout << ans.size() << endl; // for(int i = 0;i < ans.size(); ++ i) cout << ans[i] << " "; // puts(""); if(ans.size() != n) { puts("-1"); return 0; } for(int i = 0;i < ans.size(); ++ i) { cout << ans[i] << " "; } puts(""); return 0; }