Resource Distribution CodeForces - 967D

D - Resource Distribution

CodeForces - 967D

 

題意: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章