1025 吃糖果
题意:是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?
解析:本题考察的是排列组合问题,其实很简单,就是判断最多的糖果和剩下所有的糖果关系,如果大于1则不能吃完
#include
#define M 1000000
#define max(a,b) a>b?a:b
int i,n,T,MAX;
int a[M];
int main()
{
scanf("%d",&T);
while(T--)
{
long long sum=0;
scanf("%d",&n);
MAX=0;
for(i=0;i
scanf("%d",&a[i]);
sum+=a[i];
MAX=max(MAX,a[i]);
}
sum=sum-MAX+1;
if(sum>=MAX)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
1027 排列组合问题
题意:给定1到N的序列,我们定义1,2,3 ... N-1,N是所有序列中的最小序列可以由1到N组成(每个数字可以并且应该只使用一次)。 所以很容易看到第二小的序列是1,2,3 ... N,N-1。 给出N和M,求得数字1到N组成的第M个最小序列。
解析:使用next_premutation函数,具体参考https://blog.csdn.net/lishuhuakai/article/details/8006937。
#include
#include
#include
using namespace std;
int f[1010];
int main()
{
int i, j, k, n, m;
while(scanf("%d%d", &n,&m) != EOF)
{
for(i = 0; i < n; ++i)
f[i] = i+1;
k = 1;
while(next_permutation(f, f+n))
{
k++;
if(k == m)
break;
}
for(i = 0; i < n-1; ++i)
printf("%d ", f[i]);
printf("%d\n", f[n-1]);
}
return 0;
}
1028 分解数
题意:例如对4分解成:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
解析:递归求解,类似于动态规划,同时要对每个结果的值进行记忆。
#include
#include
int main()
{
int n,i,j,k;
int f[100][100];
memset(f,0,sizeof(f));
for(i=1;i<=120;i++)
{ f[i][i]=1;
for(j=1;j for(k=1;k<=j;k++)
f[i][j]+=f[i-j][k];
for(j=1;j<=i;j++) f[i][0]+=f[i][j];
}
while(scanf("%d",&n)!=EOF) printf("%I64d\n",f[n][0]);
return 0;
}