CF School Marks

分析:题意是:输入考试科目数 n ,已经考的科目数 k ,科目最高能考的分数 p ,总分不能超过的数 x ,中位数不能小于 y。再输入 k 个数代表已考的分数,让你任意输出剩的 n-k 门考试的分数,满足 n 门课的总分不超过 x ,中位数不低于 y .于是我们先计算已考的n门的分数加上剩下n-k门的最低分1的总和,如果超过x 就标记f=0。否则再找出大于等于y的那个最小的数放在中间,如果没有就加入一个考试成绩y,然后把已考的分数比y小的放数组b左边,大的放右边,相等的话就先填满右边,在填满左边,剩下的b数组中位数左边空的位置放1,右边的放y。

# include <stdio.h>
  int main()
  {
	  int i,j,t,n,k,p,x,y,a[1010],b[1010],f=1,sum,num,min,K,ans[1010];
	  scanf("%d%d%d%d%d",&n,&k,&p,&x,&y);
	  for(i=1;i<=k;i++)
		  scanf("%d",&a[i]);
	  for(i=1,sum=0;i<=k;i++)
		  sum+=a[i];
	  if(sum+n-k>x)
		  f=0;
	  min=10000;K=-1;
	  for(i=1;i<=k;i++)
		  if(a[i]-y<min&&a[i]-y>=0)
		  {
			  K=i;
			  min=y-a[i];
		  }
		  if(K==-1)
			  b[n/2+1]=y;
		  else
			  b[n/2+1]=a[K];
		  i=n/2;
		  j=n/2+2;
		  for(t=1,num=0;t<=k;t++)
			  if(t==K)
				  continue;
			  else if(a[t]<y)
				  b[i--]=a[t];
			  else if(a[t]>y)
				  b[j++]=a[t];
			  else
				  num++;
			  if(num<n+1-j)
				  j=j+num;
			  else
			  {
				  num=num-(n+1-j);
				  j=n+1;			  
				  i=i-num;
			  }
			  if(i<0||j>n+1)
				  f=0;
			  for(t=1,k=1;t<=i;t++)
				  ans[k++]=1;
			  for(t=1;t<=n+1-j;t++)
				  ans[k++]=y;
			  if(K==-1)
				  ans[k++]=y;
			  for(i=1;i<k;i++)
				  sum+=ans[i];
			  if(sum>x)
				  f=0;
			  if(f==1)
			  {
				  for(i=1;i<k-1;i++)
					   printf("%d ",ans[i]);
				  printf("%d\n",ans[i]);
			  }
			  else
				  printf("-1\n");
	  return 0;
  }


你可能感兴趣的:(ACM,CF)