63 条题解
-
2WiFi LV 8 @ 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; }
-
12020-05-15 23:13:11@
#include<bits/stdc++.h> using namespace std; int main(){ printf("我心态炸了\n"); return 0; }
-
02016-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;
}
-
02014-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. -
02009-11-04 23:14:01@
范围看错、、看成10^16了、、太不仔细了、
-
02009-10-22 20:33:24@
神似记忆化的广搜,0ms AC
-
02009-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
#includelong n,a[6]={0};
char s[66001];
long f[66001],g[66001];long Sqrt(long x)
{
int i=1;
while(i*i=65 && n -
02009-09-13 20:40:43@
未加优化的dp~
可惜没秒杀 -
02009-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 -
02009-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
爽哉 -
02009-07-22 23:44:35@
竟然相信第三个点长度为69...郁闷了...
其实是71 ... -
02009-07-20 14:01:12@
数据有严重问题,害的我交了好几次
-
02009-06-29 17:33:35@
交了N次终于过了……
-
02009-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 有效耗时:0msprogram 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. -
02009-05-18 17:18:14@
写个题解……此题告诉我们……256以上的字符串要用ansistring,细节很重要……读题很重要尤其是这些……重要内容和题干分离的题目……同时……要想清楚再写……就是这样……
-
02008-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浪费一次提交... -
02008-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)] -
02008-11-18 23:12:18@
ac率啊,降了1%,6遍才过
-
02008-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 -
02008-11-13 21:28:10@
DFS
全零
哈哈哈哈哈哈哈