1. 程式人生 > >[CodeForces 1030C] Cram Time 題解

[CodeForces 1030C] Cram Time 題解

寫一篇題解。

(其實是FQ看了Errichto的講解才懂的)

首先先找到x(x+1)<=a+b的最大x.

然後一定存在一種方案可以將1~x都讀了。

證明:

我們從大到小列舉。

對於筆記i:

如果A剩下的時間>=i,那就把i讀了。

否則,一定存在另一些筆記可以將A的時間用光。因為我們是從大到小列舉的。

所以最終情況一定是A時間被用光,所以B剩下的時間一定>=0。

模擬即可。

 1 #include <bits/stdc++.h>
 2 #define dbg(x) cout << #x " = " << x << "\n"
 3
#define mp make_pair 4 #define y0 lkhklhhkukgasdxcsasdwre 5 #define y1 ajsodihousejbkrjykuasyi 6 #define rep(i , x , y) for(int (i)=(x);(i)<=(y);++i) 7 #define per(i , y , x) for(int (i)=(y);(i)>=(x);--i) 8 #define FORALLV(i , v) for(int i = 0; i < v . size(); ++i) 9 /*********************
10 Template : LiM_817 11 *********************/ 12 using namespace std; 13 typedef long long ll; 14 typedef unsigned long long ull; 15 typedef long double ld; 16 typedef pair <int , int> pii; 17 typedef pair <ll , ll> pll; 18 typedef vector <int> vi; 19 inline int read() { 20 int
f = 1 , x = 0; char ch = getchar(); 21 while(ch < '0' || ch > '9') {if(ch == '-') f = -1;ch = getchar();} 22 while(ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}; 23 return f * x; 24 } 25 template <typename T> 26 inline void print(T x) { 27 if(x < 0) putchar('-') , x = -x; 28 if(x >= 10) print(x / 10); putchar(x % 10 + 48); 29 } 30 31 void p(vi &x) { 32 cout << x.size() << endl; 33 for(int arr : x) cout << arr << " "; 34 cout << endl; 35 } 36 int main() { 37 int a = read() , b = read(); 38 39 int s = 0; 40 int x = 0; 41 while(s + x <= a + b) { 42 s += x; x++; 43 } 44 vi va , vb; 45 x--; 46 47 for(int i = x; i >= 1; i--) { 48 if(a >= i) { 49 a -= i; 50 va.push_back(i); 51 } 52 else if(b >= i) { 53 b -= i; 54 vb . push_back(i); 55 } 56 } 57 p(va) , p(vb); 58 return 0; 59 }