题意:
第一行 n,k,p,x,y,有n个任务,已经完成了k个任务,完成任务最大得分为p,最大得分总和是x,众多分数得分的中位数是y,问剩下的任
务该得多少分才能保证分数总和不大于x,而且中位数不小于y。如果不可能出现这种情况则输出-1。
输入:
5 3 5 18 4 3 5 4
5 3 5 16 4 5 5 5
1 4
-1
分析:
就是一个不断的添加新数,判断中位数的题目,首先统计已经得到的分数中比y小的分数个数和比y大的分数个数,之后找两个临时
变量l,r表示中位数两边的临界位置,如果中位数大于y,将 l 移动到即将进行任务的位置,如果中位数小于y,则将 l 移动到开头位置,将
r 移动到不小于y的临界位置,之后至于要保证得分总和不大于x 的前提下,不断地在 l 前面添加1,在 l 后面添加y 就好。只有两种
情况会输出-1,已经完成的任务中,中位数小于y,或者最后的得分总和大于x.
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,k,p,x,y,a,num1=0,num2=0,sum=0;
cin >>n>>k>>p>>x>>y;
for(int i=0; i<k; i++)
{
cin >>a;
if(a<y)
num1++;
else
num2++;
sum+=a;
}
int mid=(n+1)/2;
if(num1>=mid)
cout <<-1<<endl;
else
{
int l,r;
if(num2>=n+1-mid) //中位数>y
{
l=n-k;
r=0;
}
else
{
l=mid-1-num1;
r=n+1-mid-num2;
}
if(l+r*y+sum>x)
cout <<-1<<endl;
else
{
for(int i=1; i<=n-k; i++)
{
if(i>1)
cout <<' ';
if(i<=l)
cout <<1;
else
cout <<y;
}
cout <<endl;
}
}
return 0;
}