UVa:10057 A mid-summer night's dream

最后的英文有点看不懂了。

 

最后要求输出:
第一个数字为A最小的可能值为多少。
第二个数字为输入中有多少个数字和 A 有相同的性质(就是能满足上述的条件者)。
第三个数字为A可能有多少种可能的不同值(这些不同的数字不必印出来)。

其实题很简单,纯粹考数学。
可以把这些x想象成数轴上的点, |X-A|的几何意义是某点X到点A的距离,很明显对于|X1-A| + |X2-A| 这种情况,A位于X1和X2中间时距离和最小,为X1和X2之间距离。
同样对于n个X也是,只要取A位于最中间的两个X之间即可,可以理解为X两两嵌套,这样距离和有最小值。如果n是奇数那A只能是中间的它自己了。


1.求最小的A,n是偶数自然是最中间的两个数中小的那个,n为奇数那就是中间那个了。
2.有多少个数跟中间俩数(n为偶数情况)或者中间的数(n为奇数)相同就是结果。
3.n为偶数那么中间俩数之间的数字都可以,n为奇数那就只有它自己行了。


感觉代码写的不是很美观。。

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int a[1000010]={0};
int main()
{
    int n;
   // freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
      for(int i=0;i<n;++i) scanf("%d",&a[i]);
      sort(a,a+n);
      int x=0,y=0,z=0;
      x=a[(n-1)/2];
      for(int i=0;i<n;++i)
        if(n%2==0)
        { if(x==a[i]||a[(n-1)/2+1]==a[i]) y++; }
        else
        { if(x==a[i]) y++; }
      if(n%2==0)
       z=a[(n-1)/2+1]-a[(n-1)/2]+1;
      else z=1;
      printf("%d %d %d\n",x,y,z);
    }
    return 0;
}

你可能感兴趣的:(数学)