2016.8.16上午纪中初中部NOIP普及组比赛

    xiaoxiao2026-06-19  2

    2016.8.16上午纪中初中部NOIP普及组比赛

    链接:https://jzoj.net/junior/#contest/home/1334 这次也翻车了,感觉比之前难多了。 辛辛苦苦改完了,太难改了!

    进度: 分数:020+AC+010+060=190 改题:AC+AC+AC+AC=AK 一、作弊 链接:https://jzoj.net/junior/#contest/show/1334/0 好坑!把string改为ansistring时50,又改了改,时间超限80 改了好久…… 莫名其妙的时超。方法和讲的一样,却时超了 题目简化: 就是在一个长字符串中找出一个最长的回文串! 正解: 枚举回文串的中心,发现比原来最长的长时, 就替代之。要注意一下长度为偶数的情况。

    var n,i,j,len,l,k,ans1:longint; s,s1,ans2:ansistring; //read&write: procedure reads; begin readln(n); readln(s); s:=s+'+'; end; procedure writes; begin writeln(ans1); writeln(ans2); end; //runs: procedure runs; begin ans1:=1; ans2:=s[1]; for k:=1 to n do begin i:=k; j:=k; while (i>1) and (j<n) and (s[i-1]=s[j+1]) do begin dec(i); inc(j); end; s1:=copy(s,i,j-i+1); len:=j-i+1; if len>ans1 then begin ans1:=len; ans2:=s1; end; i:=k; j:=k+1; if s[i]=s[j] then begin while (i>1) and (j<n) and (s[i-1]=s[j+1]) do begin dec(i); inc(j); end; end; s1:=copy(s,i,j-i+1); len:=j-i+1; if len>ans1 then begin ans1:=len; ans2:=s1; end; end; end; //files: procedure openfile(s:string); begin assign(input,s+'.in');reset(input); assign(output,s+'.out');rewrite(output); end; procedure closefile; begin close(input); close(output); end; //main program: begin openfile('cheat'); reads; runs; writes; closefile; end.

    二、最大杂志 链接:https://jzoj.net/junior/#contest/show/1334/1 这个水,一不小心就AC了。 我可是用了数据库的哟! 题目简化: 没什么好简化的! 正解: 一看就知道是找规律的题目。 先手动算一些数据, 会发现规律: 如果输入为n,那么输出的结果就为第n+1行的杨辉三角的中间数! 杨辉三角: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 …… 求出来后输入后直接输出就行了(数据库) 记得%12345678!

    var f:array[1..3001,1..3001]of qword; i,j,n:longint; //files: procedure openfile(s:string); begin assign(output,s+'.txt');rewrite(output); end; procedure closefile; begin close(input); close(output); end; begin openfile('yanghui'); for i:=1 to 3001 do begin f[i,1]:=1; f[i,i]:=1; end; for i:=2 to 3001 do for j:=2 to i-1 do begin f[i,j]:=(f[i-1,j-1]+f[i-1,j])mod 12345678; end; writeln('('); writeln(f[1,1]); for i:=2 to 3001 do begin if i mod 10<>0 then write(',',f[i,(i+1)div 2]) else writeln(',',f[i,(i+1)div 2]); end; writeln(')'); closefile; end.//创建数据库

    至于怎么用,我就不说了 三、投影 链接:https://jzoj.net/junior/#contest/show/1334/2 又是一道考语文的题目!出题者故意说复杂! 我语文差……考试时匆匆输出样例 题目简化: 不好说……一个建筑就是一个个贴着底的矩形,可以重叠的矩形! 然后组成题目的图案 最少的输出 正解: 学霸的方法! 首先那个什么w和下面输入的第一个数是没用的! 然后一层一层弄,如果遇到跟自己同样高的,就标记一下 放在一起。

    var a:array[1..10000]of longint; bz:array[1..10000]of boolean; w,n,i,j,k,x,y,ans,min,l:longint; //reads&writes: procedure reads_runs; begin readln(n,w); for i:=1 to n do begin readln(x,y); while (l>0)and(a[l]>y) do dec(l); if ((l=0)or(a[l]<y))and(y>0) then begin inc(l); inc(ans); a[l]:=y; end; end; end; procedure writes; begin writeln(ans); end; //files: procedure openfile(s:string); begin assign(input,s+'.in');reset(input); assign(output,s+'.out');rewrite(output); end; procedure closefile; begin close(input); close(output); end; //main program: begin openfile('skyline'); reads_runs; writes; closefile; end.

    四、除草 链接:https://jzoj.net/junior/#contest/show/1334/3 考试时贪心,居然能拿60分 运气,运气!! 题目简化: 就是在一条线上有很多个点,然后走来走去, 所有点都去一次的最短路程(在这里时间也一样啦) 正解: 上一届钟俊权哥哥的正解 当然是DP 设f[i,j,1]代表走过i~j的所有点,停在i处 f[i,j,2]代表走过i~j的所有点,停在j处 初始化 f[i,i,1]=f[i,i,2]=abs(l-a[i])*n; 状态转移方程: f[i,j,1]=min{f[i+1,j,1]+(a[i+1]-a[i])*(n-j+i), f[i+1,j,2]+(a[j]-a[i])*(n-j+i)} f[i,j,2]=min{f[i,j-1,1]+(a[j]-a[i])*(n-j+i), f[i,j-1,2]+(a[j]-a[j-1])*(n-j+i)} 输出min{f[1,n,1],f[1,n,2]}

    var a:array[0..1000]of longint; f:array[0..1000,0..1000,1..2] of longint; n,l,i,j:longint; //min: function min(a,b:longint):longint; begin if a<b then exit(a)else exit(b); end; //reads&writes: procedure reads; begin readln(n,l); for i:=1 to n do readln(a[i]); end; procedure writes; begin writeln(min(f[1,n,1],f[1,n,2])); end; //runs: procedure runs; procedure qsort(l,r:longint); var i,j,mid:longint; begin i:=l; j:=r; randomize; mid:=a[l+random(r-l)]; repeat while a[i]<mid do inc(i); while a[j]>mid do dec(j); if i<=j then begin a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0]; inc(i); dec(j); end; until i>j; if i<r then qsort(i,r); if l<j then qsort(l,j); end; begin qsort(1,n); for i:=1 to n do begin f[i,i,1]:=abs(l-a[i])*n; f[i,i,2]:=f[i,i,1]; end; for i:=n downto 1 do for j:=i+1 to n do begin f[i,j,1]:=min(f[i+1,j,1]+(a[i+1]-a[i])*(n-j+i), f[i+1,j,2]+(a[j]-a[i])*(n-j+i)); f[i,j,2]:=min(f[i,j-1,1]+(a[j]-a[i])*(n-j+i), f[i,j-1,2]+(a[j]-a[j-1])*(n-j+i)); end; end; //files: procedure openfile(s:string); begin assign(input,s+'.in');reset(input); assign(output,s+'.out');rewrite(output); end; procedure closefile; begin close(input); close(output); end; begin openfile('ontherun'); reads; runs; writes; closefile; end.

    给大家说个经验:如果只输入一个数的,很有可能是找规律。 在一个点里面输入t组数据的,一般都是输入后直接输出的那种。 题外话 1、我猛地发现,自从有新同学来我们教室之后,我都翻车了。希望明天不翻。 2、303的人享受着不被吵的优越的待遇,我也要努力进去! 3、今天是否能坚持AK是一个难题。最后辛苦地AK了。

    转载请注明原文地址: https://ju.6miu.com/read-1310675.html
    最新回复(0)