uva10057 - A mid-summer night's dream

这么水的题我还是WA了2次,,,,

好了,说说我是怎么错的吧。

1:忽略了每个数出现多次的情况。

2:没想清楚一个数如果出现多次该怎么办。

思路:

加入出现a,b,c,d,e,f,g等7个数,求最小的A,我们可以把7个非负整数放到数轴上,这样就变成了找到一个A点使得此点到其他7个点的距离只和最小。

这样我们就好办了,把所有的坐标排序,找到最中间的那个即可了,就是我们要找的最小的满足条件的数值,

输入中出现的符合条件的数:

如果n是偶数,则把mid和mid+1位置的数出现的次数加起来即可,(此处要注意这两个位置的数是否相等)

如果n是奇数,则只需统计mid位置的数即可。

符合条件的数的个数:

还是的分情况,若偶,则mid+1位置的数减去mid位置的数最后再加上1即可,这就是【st[mid],st[mid+1]】区间中整数的个数了。

若奇,则直接输出st[mid]出现的次数即可。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 1000000+10;
int n, st[M], vis[65540];
int main ()
{
    int mid, cnt, k;
    while(scanf("%d",&n)!=EOF)
    {
        memset(vis,0,sizeof(vis));
        for(int i = 0; i < n; i++) {scanf("%d",&st[i]); vis[st[i]]++; }
        sort(st,st+n);
        mid = (n-1)/2;
        if(n%2||(n%2==0&&st[mid]==st[mid+1])) cnt = vis[st[mid]];
        else cnt = vis[st[mid]]+vis[st[mid+1]];
        if(n%2) k = 1;
        else k = st[mid+1]-st[mid]+1;
        printf("%d %d %d\n",st[mid], cnt, k);
    }
    return 0;
}


你可能感兴趣的:(uva10057 - A mid-summer night's dream)