J:保持涼爽
時間限制:2秒 記憶體限制: 128 MB 特別法官
譯文描述
隨著學期作業量的增加,您將獲得在實驗室中向冰箱中添加蘇打水的任務,冰箱有s個插槽,每個插槽可容納d瓶蘇打水,并且您要添加n個新的蘇打水瓶,當前冰箱中的蘇打水既冷又好,但是新的蘇打水卻不然,需要在冰箱中冷卻一會兒,直到可以飲用為止,
您只能從前面重新裝滿冰箱,因此在理想的世界中,您將首先取出冰箱中當前所有的蘇打水,然后放入n個新的蘇打水,然后將舊的和冷的蘇打水放在新的冰箱前,那些,但是在理想的世界中,您也不會參加兩次考試和完成作業截止日期,您只是太忙而無法完成所有這些作業,
取而代之的是,您只需要將新瓶子放在冰箱的前面,并希望最好,但是,您仍然可以聰明地將新的汽水放入哪個插槽中,每次 學生來汽水時,他們都會從冰箱中一個均勻隨機的非空插槽的前面取一個汽水 ,您決定將新瓶添加到冰箱中,以使從冰箱中拿走蘇打水的所有接下來的m個學生都能得到一個冷水壺的可能性最大化 ,
輸入
輸入的第一行包含四個整數n,m,s和d(1≤n,m,s,d≤100),新的汽水瓶數量,要優化的學生數量,冰箱中的插槽數量,和每個插槽的容量,然后,一行包含s個整數c1,…,,,,cs(每個i為0≤ci≤d),其中ci是當前冰箱插槽i中的汽水瓶數,
您可能會認為冰箱中所有n個新瓶子都有可用空間,
輸出
如果接下來的所有m個學生都有機會得到一個冷水壺,則輸出s個整數, 描述n個汽水瓶的重新裝滿方案,以最大程度地防止這種情況發生,
這些s整數的第i個表示在冰箱中插槽i的前面放置了多少新瓶 ,如果有多個最佳補充方案,請輸出其中任何一種,否則,如果 接下來的所有m個學生都不可能得到冷蘇打,則輸出“不可能”,
樣例輸入 復制
5 3 3 4
0 1 4
樣例輸出 復制
2 3 0
題意如上,
思路:
盡可能把的往冰水少的地方放滿即可,
代碼:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+15;
typedef long long ll;
ll c[N],vis[N];
struct node{
ll v,id;
}a[N];
bool cmp(node a,node b)
{
if(a.v==b.v)
return a.id<b.id;
return a.v<b.v;
}
int main()
{
ll n,m,s,d,sum=0;
cin>>n>>m>>s>>d;
for(int i=1;i<=s;i++)
{
cin>>c[i];
a[i].v=c[i];
a[i].id=i;
sum+=c[i];
}
sort(a+1,a+1+s,cmp);
for(int i=1;i<=s;i++)
{
ll v=d-a[i].v;
if(n>=v)
{
vis[a[i].id]=v;
}
else
{
vis[a[i].id]=n;
}
n-=v;
if(n<=0)
{
ll os=0;
for(int j=i+1;j<=s;j++)
{
os+=a[j].v;
}
if(os<m)
{
cout<<"impossible"<<endl;
return 0;
}
break;
}
}
for(int i=1;i<=s;i++)
{
cout<<vis[i]<<" ";
}
cout<<endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55715.html
標籤:AI
上一篇:兩個串列邏輯回傳值問題求助!!
