许攸总是说:“吾有良略在怀,必为阿瞒所需
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
成略在胸,良计速出
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾有良略在怀,必为阿瞒所需
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
成略在胸,良计速出
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
吾才满腹,袁本初竟不从之
阿瞒有我良计,取冀州便是易如反掌
阿瞒,没有我,你得不到冀州啊!!!”
现在我们知道了,许攸就是个废话大王。
不过现在让我们来看看他是怎么帮曹操夜袭乌巢的。曹操有n个骑兵团,每一个骑兵团的耐力为d,许攸对曹操说,需要找到一个值k,耐力小于k的去乌巢东边偷袭,耐力值大于等于k的去西边偷袭,聪明的你知道有多少种取值k能让去偷袭东边的骑兵团数量和去偷袭西边的骑兵团数量相等吗?
2<=n<=1e5
1<=di<=1e5
输入全为整数
输入
n
d1 d2 d3.. dn
输出
多少种选择
样例输入
6
9 1 4 4 6 7
样例输出
2
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,d[100001],east[50000]={0}, west[50000] = {0}, eastend, westfirst;
cin >> n;
if (n >= 2 && n < 100000)
{
for (int i = 0; i < n; ++i)
{
cin >> d[i];
if (d[i] > 100000 && d[i] < 1)
exit(0);
}
if (n % 2 == 0)
{
sort(d, d + n);
for (int j = 0; j < n / 2; j++)
{
east[j] = d[j];
}
for (int j = n / 2; j < n; j++)
{
west[j - n / 2] = d[j];
}
eastend = east[n / 2 - 1];
westfirst = west[0];
cout << westfirst - eastend << endl;
}
else
cout << 0 << endl;
}
return 0;
}
一个错误答案和蹩脚算法如上;
处理本题我首先想出了一个粗略的框架。采用的是从小到大排序再对半分的思路,奇数n直接输出0,偶数再分了两个数组取东边组最末尾元素和西边组第一个元素的思路。
但是就算这样能过几个测试用例,输出还是错的。
而且有必要分东西两个数组吗?根本没必要!直接在数组里找d[n/2]和d[n/2-1]相减就可以了。
简化和优化如下,能够通过:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,d[100001], eastend, westfirst;
cin >> n;
if (n >= 2 && n <= 100000) //***注意,会有一个测试用例n=100000,适才我在此被卡了,所以要小心
{
for (int i = 0; i < n; ++i)
{
cin >> d[i];
if (d[i] > 100000 && d[i] < 1)
exit(0);
}
if (n % 2 == 0)
{
sort(d, d + n);
eastend = d[n / 2 - 1];
westfirst = d[n/2];
cout << westfirst - eastend << endl;
}
else
cout << 0 << endl;
}
return 0;
}