CF967D Resource Distribution
Posted 王宜鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF967D Resource Distribution相关的知识,希望对你有一定的参考价值。
思路:
在一堆服务器中,资源最少的那一个是“瓶颈”,由此想到贪心思路。
首先对所有服务器按照资源数量c排序,再从头到尾扫描。对每个位置,根据x1和x2计算出两段连续的服务器集合分别分配给A任务和B任务(还需要枚举分配A和B的先后顺序),如果够用,则有解。所有位置都不行,则无解。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef pair<int, int> pii; 4 pii c[300005]; 5 int n, x1, x2; 6 vector<int> check(int a, int b) 7 { 8 bool flg = false; 9 int tmp, tmp2, l, l2, i = 0; 10 for ( ; i < n; i++) 11 { 12 tmp = c[i].first; l = (a + tmp - 1) / tmp; 13 if (i + l >= n) continue; 14 tmp2 = c[i + l].first; l2 = (b + tmp2 - 1) / tmp2; 15 if (i + l + l2 > n) continue; 16 flg = true; break; 17 } 18 vector<int> ans; 19 if (flg) { ans.push_back(i); ans.push_back(l); ans.push_back(l2); } 20 return ans; 21 } 22 void show(vector<int> & v, bool rev) 23 { 24 vector<int> v1, v2; 25 for (int i = v[0]; i < v[0] + v[1]; i++) v1.push_back(c[i].second); 26 for (int i = v[0] + v[1]; i < v[0] + v[1] + v[2]; i++) v2.push_back(c[i].second); 27 cout << "Yes" << endl; 28 if (rev) 29 { 30 cout << v[2] << " " << v[1] << endl; 31 for (auto it: v2) cout << it << " "; 32 cout << endl; 33 for (auto it: v1) cout << it << " "; 34 cout << endl; 35 } 36 else 37 { 38 cout << v[1] << " " << v[2] << endl; 39 for (auto it: v1) cout << it << " "; 40 cout << endl; 41 for (auto it: v2) cout << it << " "; 42 cout << endl; 43 } 44 } 45 int main() 46 { 47 while (cin >> n >> x1 >> x2) 48 { 49 for (int i = 0; i < n; i++) { cin >> c[i].first; c[i].second = i + 1; } 50 sort(c, c + n); 51 vector<int> ans = check(x1, x2); 52 if (ans.size()) { show(ans, false); continue; } 53 ans = check(x2, x1); 54 if (ans.size()) { show(ans, true); continue; } 55 cout << "No" << endl; 56 } 57 return 0; 58 }
以上是关于CF967D Resource Distribution的主要内容,如果未能解决你的问题,请参考以下文章