CodeForces 540B--填数找中位数

来源:互联网 发布:golang redis pool 编辑:程序博客网 时间:2024/05/22 12:17

题意:

第一行 n,k,p,x,y,有n个任务,已经完成了k个任务,完成任务最大得分为p,最大得分总和是x,众多分数得分的中位数是y,问剩下的任

务该得多少分才能保证分数总和不大于x,而且中位数不小于y。如果不可能出现这种情况则输出-1。


输入:

5 3 5 18 43 5 4

5 3 5 16 45 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;}



0 0
原创粉丝点击