D - Resource Distribution
題意:S1,S2 是任務。任務量是x1,x2。現在有n個服務器,每個服務器的承載任務的容量是ci。任務可以分到 k 個服務器,每個服務器承載 x/k 的容量。要求 x/k <= xi 。問,怎麼分配這n個服務器給這兩個任務。
思路:貪心一下就好了。給 ci 排序從大到小,再優先給 S1 分配服務器cnt個,從剩下的服務器中遍歷一遍 尋找合適的cnt1 給s2。反過來(s1,s2)再計算一遍。
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 300000+10;
struct node
{
int id;
ll c;
bool operator <(const node &u) const{
return c>u.c; //從大到小
}
}C[maxn];
int main(){
ll n,x1,x2;
cin>>n>>x1>>x2;
for(int i =0;i<n;i++) cin>>C[i].c,C[i].id=i+1;
sort(C,C+n);
int flag = 0;
for(int i=0;i<n-1;i++) {
int cnt = i+1 ;
ll k = x1/cnt;
if(x1%cnt!=0) k+=1;
if(C[i].c>=k){
for(int j=i+1;j<n;j++){
int cnt1 = j-i;
ll k1 = x2/cnt1;
if(x2%cnt1!=0) k1+=1;
if(C[j].c>=k1){
flag = 1;
cout<<"Yes"<<endl;
cout<<cnt<<" "<<cnt1<<endl;
for(int x = 0;x<cnt;x++) cout<<C[x].id<<" ";cout<<endl;
for(int x = cnt;x<cnt+cnt1;x++) cout<<C[x].id<<" ";cout<<endl;
break;
}
}
break;
}
}
if(!flag){
for(int i=0;i<n-1;i++) {
int cnt = i+1 ;
ll k = x2/cnt;
if(x2%cnt!=0) k+=1;
if(C[i].c>=k){
for(int j=i+1;j<n;j++){
int cnt1 = j-i;
ll k1 = x1/cnt1;
if(x1%cnt1!=0) k1+=1;
if(C[j].c>=k1){
flag = 1;
cout<<"Yes"<<endl;
cout<<cnt1<<" "<<cnt<<endl;
for(int x = cnt;x<cnt+cnt1;x++) cout<<C[x].id<<" ";cout<<endl;
for(int x = 0;x<cnt;x++) cout<<C[x].id<<" ";cout<<endl;
break;
}
}
break;
}
}
}
if(!flag)
cout<<"No"<<endl;
return 0;
}