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; }