65 条题解

  • 1
    @ 2022-04-20 19:02:45
    
    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    string add(string str1,string str2);
    string mul(string str1,string str2);
    string calc();
    vector<int> list;
    string ans;
    int main()
    {
        int n;
        cin>>n;
        int sum=0;
        
        for(int i=2;sum<n;i++)
        {
            list.push_back(i);
            sum+=i;
        }
        
        
        
        
        if(sum==n)//恰好多项式==n 
        {
            ans=calc();
        }
        else if(sum>n)//多项式>n 
        {
            int k=sum-n;
            
            if(k==1)//刚好差1,舍弃2,最大位+1 
            {
                list.erase(list.begin(),list.begin()+1);
                list[list.size()-1]+=1;
                ans=calc();
            }
            else//否则删除list中=k的那一项 
            {
                vector<int>::iterator it;
                int flag=0;
                for(it=list.begin();it<list.end();it++)
                {
                    if(*it==k)
                    {
                        list.erase(it,it+1);
                        flag=1;
                    }
                    if(flag)
                    break;
                }
                
                ans=calc();
            }
            
        }
        
        cout<<ans;
        return 0;
    }
    string add(string str1,string str2)
    {
        if(str1.length()<str2.length())
        {
            string s;
            s=str1;
            str1=str2;
            str2=s;
        }
        string str;
        int len1=str1.length();
        int len2=str2.length();
        int dis=len1-len2;
        int cf=0;
        for(int i=len2-1;i>=0;i--)
        {
            int temp=str1[i+dis]-'0'+str2[i]-'0'+cf;
            cf=temp/10;
            temp=temp%10;
            str=char(temp+'0')+str;
            //cout<<"cf is "<<cf<<" temp is "<<temp<<endl;
        }
        for(int i=dis-1;i>=0;i--)
        {
            int temp=str1[i]-'0'+cf;
            cf=temp/10;
            temp=temp%10;
            str=char(temp+'0')+str;
        }
        if(cf>0)
        str=char(cf+'0')+str;
        if(str.find_first_not_of('0')==str.npos)
        str="0";
        else
        str.erase(0,str.find_first_not_of('0'));
        return str;
    }
    string mul(string str1,string str2)
    {
        if(str1.length()<str2.length())
        {
            string s;
            s=str1;
            str1=str2;
            str2=s;
        }
        string str="0";
        string tempstr;
        int len1=str1.length();
        int len2=str2.length();
        int dis=len1-len2;
        int cf=0;
        for(int i=len2-1;i>=0;i--)
        {
            tempstr.clear();
            cf=0;
            for(int j=len1-1;j>=0;j--)
            {
                int temp=(str1[j]-'0')*(str2[i]-'0')+cf;
                //cout<<"temp is "<<temp<<endl;
                cf=temp/10;
                //cout<<"cf is "<<cf<<endl;
                temp=temp%10;
                tempstr=char(temp+'0')+tempstr;
                //cout<<endl;
            }
            if(cf>0)
            tempstr=char(cf+'0')+tempstr;
            for(int k=1;k<=len2-1-i;k++)
                tempstr=tempstr+'0';
            
            if(tempstr.find_first_not_of('0')==tempstr.npos)
            tempstr="0";
            else
            tempstr.erase(0,tempstr.find_first_not_of('0'));
            //cout<<"tempstr is "<<tempstr<<endl;
            str=add(str,tempstr);
            //cout<<"str is "<<str<<endl;
        }
        if(str.find_first_not_of('0')==str.npos)
        str="0";
        else
        str.erase(0,str.find_first_not_of('0'));
        return str;
    } 
     
     
    string calc()
    {
        int flag=0;
        vector<int>::iterator it1;
        for(it1=list.begin();it1<list.end();it1++)
        {
            if(flag==0)
            {
                cout<<*it1;
                flag=1;
            }
            else
            cout<<" "<<*it1;
        }
        
        cout<<endl;
                
        vector<int>::iterator it;
        it=list.begin();
        string s1;
        s1=char(*it+'0')+s1;
        //cout<<"s1: "<<s1<<endl;
        for(it=list.begin()+1;it<list.end();it++)
        {
            string s2;
            int temp=*it;
            while(temp)//当*it为两位,即12,13..时,无法通过 s2=char(*it+'0')+s2;一次获取s2了 
            {
                int tempyu=temp%10;
                s2=char(tempyu+'0')+s2;
                temp=temp/10;
            }
            
            //cout<<"s2: "<<s2<<endl;
            s1=mul(s1,s2);
            //cout<<"s2 is "<<s2<<"  s1: "<<s1<<endl;
        }
        return s1;
    }
    
    
  • 1
    @ 2009-11-14 10:21:49

    大水题

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var

    i,n,j,k,x:longint;

    a:array[1..150]of longint;

    f:array[0..300]of longint;

    begin

    readln(n); k:=1;

    while n>0 do begin a[k]:=k+1;n:=n-k-1;inc(k);end;dec(k);

    if n

  • 1
    @ 2009-07-21 23:11:50

    数列(升序)越长越好(不包括1),如果数列剩下的不够a[n-1]大时就分别平分给n个数

    最后的数列就是答案,最后来个单精度,那你就可以AC了。

    Flag

      Accepted

    题号

      P1520

    类型(?)

      贪心

    通过

      164人

    提交

      491次

    通过率

      33%

    难度

      2

  • 0
    @ 2017-07-07 14:25:59

    var n,m,i,w,leng,t:longint; c,a:array[0..10000]of longint;
    procedure cheng;
    var j:longint;
    begin
    for j:=1 to leng do c[j]:=c[j]*a[i];
    for j:=1 to leng-1 do
    begin
    c[j+1]:=c[j+1]+c[j] div 10;
    c[j]:=c[j] mod 10;
    end;
    j:=leng;
    while c[j]>=10 do
    begin
    c[j+1]:=c[j+1]+c[j] div 10;
    c[j]:=c[j] mod 10;
    inc(j);
    end;
    leng:=j;
    end;
    begin
    readln(n);
    m:=n;
    i:=2;
    while m>=i do
    begin
    inc(w);
    a[w]:=i;
    m:=m-i;
    inc(i);
    end;
    t:=w-m+1;
    while t<=1 do begin
    for i:=w downto 1 do inc(a[i]);
    t:=m-1;
    end;
    if t>1 then for i:=w downto t do inc(a[i]);
    for i:=1 to w do write(a[i],' ');
    writeln;
    c[1]:=1;
    leng:=1;
    for i:=w downto 1 do cheng;
    for i:=leng downto 1 do write(c[i]);
    end.

  • 0
    @ 2017-07-07 14:25:41

    var n,m,i,w,leng,t:longint; c,a:array[0..10000]of longint;
    procedure cheng;
    var j:longint;
    begin
    for j:=1 to leng do c[j]:=c[j]*a[i];
    for j:=1 to leng-1 do
    begin
    c[j+1]:=c[j+1]+c[j] div 10;
    c[j]:=c[j] mod 10;
    end;
    j:=leng;
    while c[j]>=10 do
    begin
    c[j+1]:=c[j+1]+c[j] div 10;
    c[j]:=c[j] mod 10;
    inc(j);
    end;
    leng:=j;
    end;
    begin
    readln(n);
    m:=n;
    i:=2;
    while m>=i do
    begin
    inc(w);
    a[w]:=i;
    m:=m-i;
    inc(i);
    end;
    t:=w-m+1;
    while t<=1 do begin
    for i:=w downto 1 do inc(a[i]);
    t:=m-1;
    end;
    if t>1 then for i:=w downto t do inc(a[i]);
    for i:=1 to w do write(a[i],' ');
    writeln;
    c[1]:=1;
    leng:=1;
    for i:=w downto 1 do cheng;
    for i:=leng downto 1 do write(c[i]);
    end.

  • 0
    @ 2017-02-02 12:55:24

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,now=2,lei=1;
    int fen[10003];
    struct bigint{
    int len,dig[10005];
    bigint();
    bigint(int x);
    void clear();
    bigint operator*(bigint b);
    //bigint operator*=(bigint b);
    };

    bigint::bigint(){
    len=1;
    memset(dig,0,sizeof(dig));
    }
    bigint::bigint(int x){
    len=0;
    do
    dig[++len]=x%10;
    while(x/=10);
    }
    void bigint::clear(){
    while(len>1&&dig[len]==0)
    len--;
    }
    bigint bigint::operator*(bigint b){
    bigint ret;
    ret.len=len+b.len-1;
    for(int i=1;i<=len;i++)
    for(int j=1;j<=b.len;j++)
    ret.dig[i+j-1]+=dig[i]*b.dig[j];
    for(int i=1;i<=ret.len;i++){
    ret.dig[i+1]+=(ret.dig[i]/10);
    ret.dig[i]%=10;
    }
    if(ret.dig[ret.len+1])
    ret.len++;
    ret.clear();
    return ret;
    }
    ostream& operator<<(ostream& os,const bigint& b){
    for(int i=b.len;i>=1;i--){
    os<<b.dig[i];
    }
    return os;
    }//高精度模板
    int main(){
    cin>>n;
    while(n!=0){
    if(now>n){
    int jia=lei-1;
    for(int i=1;i<=n;i++){
    fen[jia]++;
    jia--;
    if(jia==0){
    jia=lei-1;
    }
    }
    n=0;
    }else{
    fen[lei]=now;
    lei++;
    n-=now;
    now++;
    }
    }
    for(int i=1;i<=lei-2;i++){
    cout<<fen[i]<<" ";
    }
    cout<<fen[lei-1];
    cout<<endl;
    bigint ans=1;
    for(int i=1;i<=lei-1;i++){
    ans=ans*bigint(fen[i]);
    }
    cout<<ans;
    return 0;
    }
    话说为什么最后一个点98分

  • 0
    @ 2016-12-24 17:21:27

    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    #define maxa 10000
    using namespace std;
    typedef long long ll;
    ll ans = 0;
    vector<int>v,q,v1;
    int sol(int x)
    {
    int i=1,sum = 0;
    while(sum<x)
    {
    sum+=i;
    i++;
    }
    return i-1;
    }
    bool check(vector<int> p)
    {
    int i;
    sort(p.begin(),p.end());
    for(i=0;i<p.size()-1;++i)
    if(p[i]==p[i+1])
    return false;
    return true;
    }
    void dfs(int n,int tot)
    {
    int i;
    if(n==0)
    {
    v1.clear();
    for(i=0;i<v.size();++i)
    v1.push_back(v[i]);
    if(tot>ans&&check(v1))
    {
    q.clear();
    ans = tot;
    for(i=0;i<v.size();++i)
    q.push_back(v[i]);
    }
    return ;
    }
    else
    for(i=sol(n);i<=n;++i)
    {
    v.push_back(i);
    dfs(n-i,i*tot);
    v.pop_back();
    }
    }
    int main()
    {
    int n,i,j,t,s;
    cin>>n;
    dfs(n,1);
    sort(q.begin(),q.end());
    for(i=0;i<q.size();++i)
    cout<<q[i]<<" ";
    cout<<endl;
    cout<<ans;
    return 0;
    }

  • 0
    @ 2016-12-10 12:19:12

    #include <cstdio>
    int a[1000];
    int ans[1000]={1,1};
    void ch(int a[],int m)
    {int i;
    for(i=1;i<=a[0];i++)
    a[i]*=m;
    for(i=1;i<=a[0]+6;i++)
    {a[i+1]+=a[i]/10;
    a[i]%=10;
    }
    for(i=a[0]+6;a[i]==0&&i>1;i--);
    a[0]=i;
    }
    void prt(int a[])
    {for(int i=a[0];i>=1;i--)
    printf("%d",a[i]);
    }
    int main()
    {

    int n,i,k;
    long long s=1;
    scanf("%d",&n);
    if(n<5) {printf("%d\n%d",n,n);return 0; }

    for(i=2;i<=n;i++)
    {a[i]=i;n=n-i;
    }
    k=i-1;i=k;
    while(n>=1)
    {a[i--]++;n--;if(i==1)i=k;}
    for(i=2;i<=k;i++)
    {
    printf("%d ",a[i]);
    ch(ans,a[i]);
    }
    printf("\n");
    prt(ans);
    return 0;
    }

  • 0
    @ 2014-02-05 13:01:22

    这种水题,我竟WA了两次!生气啊!
    第一次代码:#include<stdio.h>
    #include<math.h>
    long a[10001];
    long n,num2,num3,i,j,k,x;
    using namespace std;
    int main()
    {
    scanf("%ld",&n);
    if (n%3==0) num3=n/3;
    else if (n%3==1)
    {
    num2=2;num3=(n-4)/3;
    printf("2 2 ");
    }
    else if (n%3==2)
    {
    num2=1;num3=(n-2)/3;
    printf("2 ");
    }
    for (i=1;i<num3;i++)
    printf("3 ");
    if (num3>0) printf("3");
    printf("\n");
    a[1]=long(pow(2,num2));k=1;
    for (i=1;i<=num3;i++)
    {
    x=0;
    for (j=1;j<=k;j++)
    {
    a[j]=a[j]*3+x;
    x=long(a[j]/10);a[j]=a[j]%10;
    }
    while (x>0)
    {
    k++;a[k]=x%10;x=long(x/10);
    }
    }
    for (i=k;i>0;i--)
    printf("%ld",a[i]);
    return 0;
    }

    因为没看清“不同的数字”,就简单地认为3越多越好。
    第二次代码:
    #include<stdio.h>
    #include<math.h>
    long long a[10001],x;
    long p[10001];
    long n,num2,num3,i,j,len,k;
    using namespace std;
    int main()
    {
    scanf("%ld",&n);
    if (n<5)
    {
    printf("%ld\n%ld",n,n);
    return 0;
    }
    p[1]=2;n-=2;len=1;
    while (n>=p[len]+1)
    {
    len++;
    p[len]=p[len-1]+1;
    n-=p[len];
    }
    j=len;
    while (n>0)
    {
    p[j]++;
    n--;j--;
    if (j=0) j=len;//注意这里!!!
    }
    for (i=1;i<len;i++)
    printf("%ld ",p[i]);
    printf("%ld\n",p[len]);
    a[1]=1;k=1;
    for (i=1;i<=len;i++)
    {
    x=0;
    for (j=1;j<=k;j++)
    {
    a[j]=a[j]*p[i]+x;
    x=(long long)(a[j]/10);
    a[j]=a[j]%10;
    }
    while (x>0)
    {
    k++;a[k]=x%10;x=(long long)(x/10);
    }
    }
    for (i=k;i>0;i--)
    printf("%ld",a[i]);
    return 0;
    }
    原来信心满满,打算直接AC,没想到WA了两个点。
    我自己做了个数据:17,就发现了问题。原来,文中标出的地方==打成了=。
    因为刚从P转过了,都不太熟练。导致此错误。
    特此提醒自己,不要再犯低级错误了。

    BY JSB 绍兴一中万岁!

  • 0
    @ 2010-03-05 17:56:12

    一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。 现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。Input只一个正整数n,(30 do N有可能有剩余一部分完成使拆分结果为等差数列的拆分,上一个WHILE循环肯定还剩一部分无法拆分的部分,将其分摊到前面的数上,为了不使数列重复,我们从后分摊

    begin

    inc(a[i]);

    dec(n);

    dec(i);

    if i=0 then i:=len;

    end;

    for i:=1 to len do write(a[i],' ');

    writeln;

    fillchar(max,sizeof(max),0);

    long:=1; max[1]:=1;

    for i:=1 to len do

    begin

    for j:=1 to long do

    max[j]:=max[j]*a[i];

    for j:=1 to long+10 do

    begin

    inc(max[j+1],max[j] div 10);

    max[j]:=max[j] mod 10;

    end;

    inc(long,10);

    while max[long]=0 do dec(long);

    end;

    for i:=long downto 1 do write(max[i]);

    End.

  • 0
    @ 2009-10-31 15:12:58

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-10-30 09:15:21

    不看题害死人呀~~

    恩..的确是不同的自然数..

    恩..鉴定完毕..

    注意 如果是任意分的话肯定要将n分为尽可能多的 3 ………

    再插一句 LX的3 4 7……应该是3 4 6

  • 0
    @ 2009-10-28 20:51:53

    lishunzhi数据蒙对的吧

    如输入13

    你输出3 4 5

    60

    明摆着是3 4 7

    72

  • 0
    @ 2009-10-07 17:32:41

    注意。。

    是互不相同的数字。。。。。

    只要从2,3,4一直分就好。。

    分到不够了。。

    剩下的,从高向低加1。

    最后高精乘一下就出答案了。。。

  • 0
    @ 2009-09-24 18:36:15

    为什么不是这样的

    k=n div 3; a=n mod 3;

    如果 a=1 就 dec(k) 因为 4*3>3*3*1

    如果 a=2 就是 3*2

    所以就有 2*3*3*3*……*3*3*3

    3*3*3*3*……*3*3*3

    3*3*3*3*……*3*3*4…… 三种 使得 积最大。

    3*3*3*2>3*4*4

    3*3>2*2*2

    ……

    ps:有意者请到讨论里面留个言,谢谢。

  • 0
    @ 2009-09-23 16:57:57

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var n,m,i,w,leng:longint; c,a:array[0..10000]of longint;

    procedure cheng;

    var j:longint;

    begin

    for j:=1 to leng do c[j]:=c[j]*a[i];

    for j:=1 to leng-1 do

    begin

    c[j+1]:=c[j+1]+c[j] div 10;

    c[j]:=c[j] mod 10;

    end;

    j:=leng;

    while c[j]>=10 do

    begin

    c[j+1]:=c[j+1]+c[j] div 10;

    c[j]:=c[j] mod 10;

    inc(j);

    end;

    leng:=j;

    end;

    begin

    readln(n);

    m:=n;

    i:=2;

    while m>=i do

    begin

    inc(w);

    a[w]:=i;

    m:=m-i;

    inc(i);

    end;

    for i:=w downto w-m+1 do inc(a[i]);

    for i:=1 to w do write(a[i],' ');

    writeln;

    c[1]:=1;

    leng:=1;

    for i:=w downto 1 do cheng;

    for i:=leng downto 1 do write(c[i]);

    end.

  • 0
    @ 2009-09-20 11:36:53

    受不了,我在下面测4

    怎么改都不对

    交上居然过了

    水!

  • 0
    @ 2009-09-19 20:00:50

    囧死了......刚开始我以为是分解成一堆3的说.....

    交了2遍.......然后才发现是要分解成不同的数......囧死.....

  • 0
    @ 2009-09-16 21:44:00

    107/300(36%)

    通过   255人

    提交   706次

    通过率   36%

    一次AC

    提交三百次

    纪念一下

    PS.通过率一样哦~

  • 0
    @ 2009-09-12 16:23:47

    我得了1分。。。

信息

ID
1520
难度
5
分类
贪心 | 高精度 点击显示
标签
递交数
1440
已通过
473
通过率
33%
被复制
3
上传者