您的位置:首页 > 其它

[1103模拟赛][noi导刊第八期模拟题十六]

2010-11-03 11:28 399 查看
1.方程

给出非负整数n,统计不定方程x+y^2+z^3=n,的非负整数解(x,y,z)的数量。

令k=n-z^3;

则k最多有10^6个值

x+y^2=k

y的取值个数有sqrt(k)+1个

累加y

#include<fstream>
#include<cmath>
using namespace std;
ifstream cin("equation.in");
ofstream cout("equation.out");
long long n,k,ans;
long long x,y,z;
int main()
{
cin>>n;
ans=0;
z=0;
while ((z*z*z)<=n)
{
k=n-z*z*z;
y=(int)sqrt((double)k)+1;
ans+=y;
z++;
}
cout<<ans;
return 0;
}


2.方程式

模拟,字符串处理

注意结果是0的时候

代码

var s,left,right,temp:string;
tot,num,t,tmp,i:longint;
flag:boolean;
ans:double;
begin
assign(input,'equationagain.in');reset(input);
assign(output,'equationagain.out');rewrite(output);
readln(s);
t:=pos('=',s);
left:=copy(s,1,t-1);
right:=copy(s,t+1,length(s)-t);
t:=length(left);
for i:=1 to t do
begin
if left[i] in ['0'..'9'] then temp:=temp+left[i]
else
begin
if left[i]='x' then
begin
if temp='' then tmp:=1 else val(temp,tmp);
if flag then tmp:=-tmp;
flag:=false;
inc(tot,tmp);
temp:='';
end
else
begin
val(temp,tmp);
if flag then tmp:=-tmp;
flag:=false;
inc(num,tmp);
temp:='';
end;
end;
if left[i]='-' then flag:=true;
if (i=t)and(left[i] in ['0'..'9']) then
begin
val(temp,tmp);
if flag then tmp:=-tmp;
flag:=false;
inc(num,tmp);
temp:='';
end;
end;
t:=length(right);
tot:=-tot;
for i:=1 to t do
begin
if right[i] in ['0'..'9'] then temp:=temp+right[i]
else
begin
if right[i]='x' then
begin
if temp='' then tmp:=1 else val(temp,tmp);
if flag then tmp:=-tmp;
flag:=false;
inc(tot,tmp);
temp:='';
end
else
begin
val(temp,tmp);
if not flag then tmp:=-tmp;
inc(num,tmp);
flag:=false;
temp:='';
end;
end;
if right[i]='-' then flag:=true;
if (i=t)and(right[i] in ['0'..'9']) then
begin
val(temp,tmp);
if not flag then tmp:=-tmp;
flag:=false;
inc(num,tmp);
temp:='';
end;
end;
if num=0 then ans:=0 else
ans:=num/tot;
writeln(ans:0:3);
close(input);close(output);
end.


3.MUTI

貌似是数学题,我开始也一直向数学解法上想。

其实是一个经典的完全无限背满包

f[i]=sigma(f[i-a[j]);

#include<fstream>
using namespace std;
ifstream cin("muti.in");
ofstream cout("muti.out");
int n,c;
int a[110];
int f[100010];
int main()
{
cin>>n>>c;
for (int i=1;i<=n;i++) cin>>a[i];
f[0]=1;
for (int i=1;i<=n;i++)
{
for (int j=a[i];j<=c;j++)
{
f[j]+=f[j-a[i]];
f[j]%=999983;
}
}
cout<<f[c]<<endl;
return 0;
}


4.交错匹配

DP

f[i][j]=max{f[i][j-1],f[i-1][j]}

找到距离i最近的a[s]和b[k]相等f[i][j]>?=f[s-1][k-1];

#include<fstream>
using namespace std;
ifstream cin("cross.in");
ofstream cout("cross.out");
int m,n;
int a[1010],b[1010],s[32768];
int k,f[1010][1010];
int main(void)
{
int i,j;
cin>>n>>m;
for (i=1;i<=n;i++) cin>>a[i];
for (i=1;i<=m;i++) cin>>b[i];
for (i=0;i<=32767;i++) s[i]=10000;
for (i=1;i<=n;i++)
{
k=0;
for (j=1;j<=m;j++)
{
if (a[i]==b[j]) {k=j;}
if (a[i]!=b[j])
if ((s[b[j]]<i)&&(k>0)) f[i][j]>?=(f[s[b[j]]-1][k-1]+2);
f[i][j]>?=f[i][j-1];
f[i][j]>?=f[i-1][j];
}
s[a[i]]=i;
}
cout<<f
[m]<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: