纪中集训2020.01.13【NOIP普及组】模拟赛C组总结
题目编号 标题
0 【NOIP普及组模拟】取值( numbers.pas/cpp)
1 【NOIP普及组模拟】数对(pairs.pas/cpp )
2 【提高组NOIP2008】传纸条(message.pas/cpp)
3 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)
~~巨佬估分:30+100+30+36.4=196.4~
蒟蒻得分:30+10+0+9.1=49.1
崩了!!!
第8,49.1分!!!一共10个人比赛FAQ
在AC代码和WA10分的代码中纠结,幸运的 我自豪的把WA的代码交上去了!
比赛完,巨佬们:啊!我少打了一点,少了个if,忘记附初始值了,差点就AK了!FAQ
蒟蒻(只有我):这个知识点好像还没学,emmmm…
0.【NOIP普及组模拟】取值( numbers.pas/cpp)
题目大意:读入n&m。使得x[1]+x[2]+x[3].......+x[n]=m。使得必须
0<=x[1]<=x[2]<=........x[n]<=m,求(x[1]到x[n])的取法总数 mod 100000007 的值?
样例输入
2
3 2
7 3
样例输出
2
8
数据范围限制
对于 10%的数据,1<=n<=m<=10
对于 30%的数据,1<=n<=m<=50
对于 50%的数据,1<=n<=m<=100
对于 100%的数据,T<=20,1<=n<=m<=300
分析直接崩了!!!30分,一个递归,看似很水的题目,实际上,还是很水!
正解,巨佬们说不就是个简单附初始值的DP(动态规划)吗?十几分钟就AC了!FAQ实力碾压
正解分析:首先,把对于 100%的数据,T<=20,1<=n<=m<=300,的所有的值都附一个初始值DP式
**f[i,j]:=f[i-1,j]+f[i,j-i];**记得把f[i,0]:=1;
然后直接输出!!!
注意M&N 读入二数的实际意义
附上AC Pascal 代码:
var
n,x,y:int64;
i,j,k,sum:longint;
f:array[-305..305,-305..305]of int64;
begin
assign(input,'numbers.in');
reset(input);
assign(output,'numbers.out');
rewrite(output);
readln(n);
for i:=1 to 305 do
begin
f[i,0]:=1;
for j:=1 to 305 do
begin
f[i,j]:=f[i-1,j]+f[i,j-i];
end;
end;
for i:=1 to n do
begin
readln(x,y);
writeln(f[y,x] mod 100000007);
end;
close(input);
close(output);
end.
附上AC C++ 代码:
#include<cstdio>
using namespace std;
int t,n,m,k,i,j,f[1001][1001];
int main()
{
freopen("numbers.in","r",stdin);
freopen("numbers.out","w",stdout);
scanf("%d",&t);
for (k=1;k<=t;k++)
{
scanf("%d%d",&m,&n);
for (i=1;i<=n;i++)
f[i][0]=1;
for (i=