30天编程练习(六)

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

 
   


你可能感兴趣的:(30天编程练习(六))