[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
2.方程式
模拟,字符串处理
注意结果是0的时候
代码
3.MUTI
貌似是数学题,我开始也一直向数学解法上想。
其实是一个经典的完全无限背满包
f[i]=sigma(f[i-a[j]);
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];
给出非负整数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; }
相关文章推荐
- Spfa【P1813】拯救小tim_NOI导刊2011提高(02)
- 模拟赛 模拟题
- 堆or优先队列(洛谷1801 黑匣子_NOI导刊2010提高(06))
- 上下界 又见上下界 noi模拟题snake
- 洛谷 P1776 宝物筛选_NOI导刊2010提高(02)
- P1807 最长路_NOI导刊2010提高(07)--最长路
- 洛谷P1801 黑匣子_NOI导刊2010提高(06)
- P1958 上学路线_NOI导刊2009普及(6)
- 【NOI导刊】黑匣子
- P1807 最长路_NOI导刊2010提高(07)
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)(多重背包,单调队列)
- 单人纸牌_NOI导刊2011提高(04)
- |洛谷|NOI导刊|堆|黑匣子_NOI导刊2010提高(06)
- 2017.3.25NOI模拟赛总结
- 洛谷 P1815 蠕虫游戏 _NOI导刊2011提高(02)
- 淘汰赛制(NOI导刊2010提高 01)
- [NOI模拟题7T2 Sort]
- 小明搬家_NOI导刊2010提高(05)
- 洛谷 P1845 影像之结构化特征_NOI导刊2011提高(12)
- 【NOIP 模拟题】[山东多校联合模拟赛 day1 T3] Formula 1 (BFS+并查集)