将正整数n分解为m个互不相同/相同/m个不同的自然数之和,使这些自然数的乘积最大

文章目录

          • 不相同
            • 规律:
            • 贪心:
          • 可以相同的
          • m个不相同

不相同

找规律或者贪心

规律:

a[4]=a[1]+a[3],a[5]=a[4]+a[2],a[6]=a[5]+a[2],
a[7]=a[6]+a[4],a[8]=a[7]+a[5],a[9]=a[8]+a[5]

写出来你就发现每三个有个特殊的,嗯,就是这样的,不要怀疑。

#include
using namespace std;
typedef long long ll;
ll ans[2005];
const ll mod=2000000000000000003;
void init()
{
    ans[1]=1,ans[2]=2,ans[3]=3;
    int t=0;
    for(int i=4;i<2005;i++)
    {
         if(t==3)
         {
             t=0;
             ans[i]=(ans[i-1]+ans[i-4])%mod;
         }
         else
         {
             ans[i]=(ans[i-1]+ans[i-3])%mod;
         }
         t++;
    }
}
int main()
{
    init();
    int T;
    cin>>T;
    while(T--)
    {
        int x;
        cin>>x;
        cout<
贪心:

元素相连,尽可能均分元素,如果往后有剩余,从后往前每个多分个1

#include
#include
using namespace std;
int main(){
    int num;
    while(cin>>num){
        int flag[100] = {0};
        int k=2;
        int i=0;
        while(num >= k){
            flag[i++] = k;
            num -= k;
            k++;
        }
        if(num > 0){
            if(num == flag[i-1]){
                flag[i-1]++;
                num--;
            }
            for(int j=i-1;j>=0 &&num>0;j--){
                flag[j] ++;
                num--;
            }
 
        }
        int result = 1;
        for(int j = 0;j
可以相同的

尽可能的分3,如果不能分3就分离个2出来

#include
#include
using namespace std;
int main(){
    int num;
    while(cin>>num){
        if(num % 3 == 0){
            cout<
m个不相同

与互不相同类似,贪心解决。

#include
using namespace std;
int test(int x,int y)
{
    if((y+y*y)>(2*x))
        return 0;
    else
        return 1;
}
void slove(int x,int y)
{
    int flag[1000],index=1,k=2;
    while(x>=k)
    {
        flag[index++]=k;
        x-=k;
        k++;
        if(index-1==y)
            break;
    }
    if(index==y&&x!=0)
    {
        flag[index]=1;
        x--;
        while(x!=0)
        {
            for(int j=index;j>=1&&x!=0;j--)
            {
                flag[j]++;
                x--;
            }
        }
        long long ans=1;
        for(int i=1;i<=index;i++)
            ans*=flag[i];
        cout<=1&&x!=0;j--)
            {
                flag[j]++;
                x--;
            }
        }
        long long ans=1;
        for(int i=1;i<=index;i++)
            ans*=flag[i];
        cout<>t;
    while(t--)
    {
        cin>>n>>m;
        if(test(n,m)==0)
            cout<<-1<

你可能感兴趣的:(Acm)