题解

63 条题解

  • 2
    @ 2017-08-19 21:18:01

    四平方和定理:每个正整数均可表示为4个整数的平方和

    故分成的序列<=4个

    所以可使用搜索

    从大往小依次进行搜索,找出所需序列最少的,因为搜的顺序从大到小所以搜出来以后顺序默认就是符合题意的

    搜出来之后直接输出

    代码如下

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    string s;
    int a[5],m,n,p=6,b[5];
    void dfs(int k,int r,int ss){
        if(ss>m) return;
        if(k>=p) return;
        if(ss==m){
            p=k;
            for(int i=1;i<k;i++) b[i]=a[i];
            return;
        }
        for(int i=r;i;i--){
            a[k]=i;
            dfs(k+1,i,ss+i*i);
        }
        return;
    }
    int main(){
        getline(cin,s);
        m=s.size(),n=sqrt(m);
        dfs(1,n,0);
        int l=0;
        for(int i=1;i<p;i++){
            for(int j=l+1;j<=l+b[i];j++){
                for(int k=0;k<b[i];k++){
                    cout<<s[j+k*b[i]-1];
                }
            }
            l+=b[i]*b[i];
        }
        return 0;
    }
    
  • 1
    @ 2020-05-15 23:13:11
    #include<bits/stdc++.h>
    using  namespace std;
    int main(){
        printf("我心态炸了\n");
        return 0;
    }
    
  • 0
    @ 2016-12-31 12:05:50

    一道猥琐的背包
    背时记得平方从小到大,记录转移再从后向前推
    c++
    #include<iostream>
    #include<string>
    #include<cstdio>
    using namespace std;
    int g[70000],dp[70000],ans[70000];
    string str,out;
    int main()
    {
    //freopen("test.in","r",stdin);
    int m=0,i,j,n,s,k;
    getline(cin,str);
    n=str.length();
    for(i=1;i<=n;i++)
    {
    dp[i]=1<<30;
    for(j=1;j*j<=i;j++)
    if((g[i-j*j]<=j || i==j*j) && dp[i-j*j]+1<=dp[i])
    {
    dp[i]=dp[i-j*j]+1;
    g[i]=j;
    }
    }
    i=n;
    s=0;
    while(i>0)
    {
    s++;
    ans[s]=g[i];
    i-=g[i]*g[i];
    }
    for(i=1;i<=s;i++)
    {
    m+=ans[i-1]*ans[i-1];
    for(j=0;j<ans[i];j++)
    for(k=0;k<ans[i];k++)
    out+=str[k*ans[i]+j+m];
    }
    cout<<out;
    return 0;
    }

  • 0
    @ 2014-08-05 20:38:47

    默默地秒杀了。。。
    program p1480;
    var a,b:array[0..70000] of longint;
    t:array[0..70000] of boolean;
    h,ss:array[0..200] of longint;
    f:array[0..300,0..300] of char;
    s:ansistring;
    n,m:longint;
    //
    procedure init;
    begin
    read(s);
    n:=length(s);
    end;
    //
    procedure make(p:longint);
    var i,j:longint;
    begin
    for i:=1 to h[p] do
    for j:=1 to h[p] do
    begin
    f[i,j]:=s[ss[p]];inc(ss[p]);
    end;
    for i:=1 to h[p] do
    for j:=1 to h[p] do write(f[j,i]);
    end;
    //
    procedure main;
    var i,j:longint;
    begin
    for i:=1 to n do
    begin
    a[i]:=1000000;b[i]:=1000000;
    end;
    t[0]:=true;
    for i:=1 to n do
    for j:=1 to trunc(sqrt(i)) do
    if t[i-j*j] then
    begin
    t[i]:=true;
    if a[i-j*j]+1<a[i] then
    begin
    a[i]:=a[i-j*j]+1;b[i]:=j;
    end
    else if a[i-j*j]+1=a[i] then
    if j>b[i] then b[i]:=j;
    end;
    end;
    //
    procedure print;
    var i,k:longint;
    begin
    i:=n;
    while i<>0 do
    begin
    inc(h[0]);h[h[0]]:=b[i];i:=i-b[i]*b[i];
    end;
    ss[1]:=1;
    for i:=2 to h[0] do ss[i]:=ss[i-1]+h[i-1]*h[i-1];
    for i:=1 to h[0] do
    begin
    make(i);
    end;
    end;
    //
    begin
    init;
    main;
    print;
    end.

  • 0
    @ 2009-11-04 23:14:01

    范围看错、、看成10^16了、、太不仔细了、

  • 0
    @ 2009-10-22 20:33:24

    神似记忆化的广搜,0ms AC

  • 0
    @ 2009-10-22 00:31:50

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    竟然没有一个C的程序出现,看起来真郁闷..

    第3组数据的n过不了,所以CHEAT了...

    用的不是完全背包的状态转移方程,不过本质上一样...

    然后不小心发现了任意自然数可以表示四个非负整数的平方和..

    后面查了下这个四平方和定理,嗯,长见识了.

    #include

    #include

    #include

    long n,a[6]={0};

    char s[66001];

    long f[66001],g[66001];

    long Sqrt(long x)

    {

    int i=1;

    while(i*i=65 && n

  • 0
    @ 2009-09-13 20:40:43

    未加优化的dp~

    可惜没秒杀

  • 0
    @ 2009-09-12 20:56:29

    program p1480;

    var

    f,fh:array[1..70000] of integer;

    s:ansistring;

    l,k,i,j,chang,st,long:longint;

    procedure print(ss:ansistring; k,start,long:longint);

    var

    s:ansistring;

    i,j:longint;

    begin

    s:=copy(ss,start,long);

    for i:=1 to k do

    for j:=1 to k do

    write(s[(j-1)*k+i]);

    end;

    begin

    readln(s); l:=length(s);

    fillchar(f,sizeof(f),0);

    k:=trunc(sqrt(l));

    for i:=1 to k do begin f[sqr(i)]:=1;fh[sqr(i)]:=i; end;

    if sqr(trunc(sqrt(l)))=l then

    begin

    k:=trunc(sqrt(l));

    print(s,k,1,l);

    end

    else

    begin

    for i:=1 to l do

    if f[i]=0 then

    begin

    f[i]:=20000;

    for j:=trunc(sqrt(i)) downto 1 do if f+1

  • 0
    @ 2009-08-06 14:23:19

    编译通过...

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

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

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

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

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

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

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

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

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

    ├ 测试数据 10:答案正确... 9ms

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

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

    爽哉

  • 0
    @ 2009-07-22 23:44:35

    竟然相信第三个点长度为69...郁闷了...

    其实是71 ...

  • 0
    @ 2009-07-20 14:01:12

    数据有严重问题,害的我交了好几次

  • 0
    @ 2009-06-29 17:33:35

    交了N次终于过了……

  • 0
    @ 2009-06-18 17:35:46

    AC标程,仅供参考。

    谢谢。

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    program P1480;

    var

    s,r,y :ansistring;

    i,j,k,l,t,p :longint;

    ans,next :array[0..65536]of longint;

    begin

    readln(s);

    fillchar(ans,sizeof(ans),127);

    fillchar(next,sizeof(next),0);

    ans[0]:=0; l:=length(s);

    for i:=1 to l do

    for j:=trunc(sqrt(l-i+1)) downto 1 do

    begin

    t:=ans+1;

    if ans>t then

    begin

    ans:=t;

    next:=j;

    end;

    end;

    i:=l; r:=''; k:=0;

    while next[i]0 do

    begin

    j:=next[i]; i:=i-j*j;

    y:=copy(s,k+1,j*j); k:=k+j*j;

    for l:=1 to j do

    for p:=1 to j do r:=r+y[(p-1)*j+l];

    end;

    writeln(r);

    end.

  • 0
    @ 2009-05-18 17:18:14

    写个题解……此题告诉我们……256以上的字符串要用ansistring,细节很重要……读题很重要尤其是这些……重要内容和题干分离的题目……同时……要想清楚再写……就是这样……

  • 0
    @ 2008-12-13 21:46:10

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    DFS都0ms...看来不用FT了...

    被ANSISTRING浪费一次提交...

  • 0
    @ 2008-12-08 13:39:39

    program p2;

    var

    s:ansistring;

    l,i,p,j,k:longint;

    f:array[0..70000] of integer;

    a:array[1..70000] of array[1..5] of integer;

    procedure doit(k:longint);

    var

    i,min,j:longint;

    begin

    min:=2147483647;

    for i:=trunc(sqrt(k)) downto trunc(sqrt(k/2)) do

    if 1+f[k-sqr(i)]

  • 0
    @ 2008-11-18 23:12:18

    ac率啊,降了1%,6遍才过

  • 0
    @ 2008-11-13 22:01:14

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    @ 2008-11-13 21:28:10

    DFS

    全零

    哈哈哈哈哈哈哈

信息

ID
1480
难度
7
分类
字符串 | 动态规划 | 背包 点击显示
标签
递交数
800
已通过
138
通过率
17%
被复制
3
上传者