题目: 意思明确 给定 n个人的分数 随便取k个人(k>=2)分为两组
要求分数第一组的最低分比第二组的最高分高
分析: 考想法的一道题 有多种想法可以解决
我的想法是
把n个人分数从高到低排列
从最高分开始往后累加 以X(该数)为第一组的最小值
X左边(大于X的区域)选取任意数放入第一组 有P1种情况
X右边(小于X的区域)选取任意数(至少一个)放入第二组 P2种
明显 P1=2^(n-X) P2=2^(X-2)-1(减去个数为0的情况);
dp【i】+=P1*P2;
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll pow2(int a)
{
ll ans=1;
while(a--) ans<<=1;
}
int main()
{
ll dp[1000];
dp[2]=1,dp[1]=0;
for(int i=3;i<40;i++)
{
dp[i]=(1<<i-1)-1;
for(int j=2;j<i;j++)
{
dp[i]+=((1<<j-1)-1)*(1<<(i-j));
}
}
int n;
while(scanf("%d",&n)==1)
{
printf("%lld\n",dp[n]);
}
return 0;
}