CodeForces #301 B. School Marks

题目链接:http://codeforces.com/contest/540/problem/B

大致题意:给定一个数组有n个数,有k个数是已知的,p是数组内元素大小上限,x是数组元素和的上限,x是整个数组中位数的大小下限。

输入:第一行nkpx and y

        第二行 k个元素。

求不知道 的那 n - k 个元素

例如:

input :5 3 5 18 4
           3 5 4 
output:4 1 
思路:我们可以这样想,我们把整个数组中位数以后的小于y的数都替换成y,把中位数以前的还未知的数都替换成1, 当然,本来就已知的k个数不能变。我们可以进行如下处理:
代码:
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 int a[1005],b[1000];
 7 int n,k,p,x,y;
 8 int main()
 9 {
10     scanf ("%d %d %d %d %d",&n,&k,&p,&x,&y);
11     int i,j,len=0,flag=0;
12     for(i=0;i<k;i++)
13         scanf ("%d",&a[i]);
14     sort(a,a+n);//我们首先对这个数组排序。那么未知的位置为0 。我们可以知道n/2 以后的位置有多少小于中位数。
15     for(i=n-1,j=0;i>=n/2;i--)
16     {
17         if(a[i]<y)//从后往前遍历,遇到0,则直接把这个y放入这个位置。b[]数组是记录放入了多少的数
18         {
19             if(a[i]!=0)//遇到不是0但是该位置的数小于y的情况,把该数依次放入开头的位置。。a[0],a[1]...
20             {
21                 if(a[j]==0)
22                 {
23                     a[j++]=a[i];//把该数放到开头,并把y放入此位置
24                     a[i]=y;
25                     b[len++]=y;//记录放入的元素
26                 }
27             }else  //这是遇到0的情况,直接把y放入该位置
28             {
29                 a[i]=y;
30                 b[len++]=y;
31             }
32         }
33     }
34     for(i=0;i<n/2;i++)//从0~n/2,依次把还是0的位置上的数替换成1
35         if(a[i]==0)
36         {
37             b[len++]=1;
38             a[i]+=1;
39         }
40     int sum=0;
41     for(i=0;i<n;i++)//计算数组和
42         sum+=a[i];
43     if(sum>x||a[n/2]<y)//判断不成立的情况,sum>x和中位数<y
44         printf("-1\n");
45     else
46     {
47         for(i=0;i<len;i++)
48             if(i==len-1)
49                 printf("%d",b[i]);
50             else
51                 printf("%d ",b[i]);
52     }
53     return 0;
54 }
加油啊!!!

posted on 2015-05-04 16:01  Bei_insomia  阅读(184)  评论(0编辑  收藏  举报

导航