CodeForces #301 B. School Marks
题目链接:http://codeforces.com/contest/540/problem/B
大致题意:给定一个数组有n个数,有k个数是已知的,p是数组内元素大小上限,x是数组元素和的上限,x是整个数组中位数的大小下限。
输入:第一行n, k, p, x 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) 编辑 收藏 举报