2020.01.17【NOIP提高组】模拟B 组总结

隔了好几天,终于又开始写博客了,最近的题好难,改的都没时间写博客了!!!
今天打一个总结。(题解发链接,若有意者可以看一看)

赛前

又是日常晚20分钟起床,日常不吃早餐,这次到教室还有10分钟就开始了。(反正没人管

之后就随便水水题,比赛开始。

赛时

第一题

【中山市选2014】投票

又是关于字符串,烦死!!!,自从转c++以后,面对字符串都是绕着走,什么读入,删啊,选啊,判断啊,不懂。也是最近才将快读搞懂,但是那函数真不会用。

所以第一题算是水题,爆0

讲讲具体怎么爆0:

1.输出要求double保留两位小数。。。不会,之后问大佬,得到了这个:printf("%.2llf\n",b);本地正确,OJ错误

2.没审题,误认。

第二题

【中山市选2014】dwarf tower
算是一个树型dp,本来就没想ac,随后72.5。

第三题

【中山市选2014】J语言

又是字符串,无视。
正解太繁杂,不会。直接给题目看吧:

描述

J语言作为一门编程语言,诞生于20世纪90年代…

好学的小H今天又学到了一种新东西——J语言。显然,J语言的背景已经被小H忘得一干二净了,但是小H仍然记得J语言中有趣的数学计算——向量计算。

在J语言中,向量,标量和操作符是基本的组成元素,但是在小H的印象中,J语言中最有趣的就是它的语法,好学的小H也曾经认真研究J语言的语法并且进行了化简。在小H简化了J语言的语法中,用X来表示向量,用N来表示向量X的长度。

简化版J语言的规则如下:

操作符中有有二元操作符,“+”,“-”,“*”,而对应操作数可以是两个标量,两个向量,或则一个标量和一个向量。(当两个向量运算时,为对应位分别计算,例如(1,2,3) * (2,3,4) = (2,6,12),当一个标量和一个向量运算时,当成标量和向量的每一位运算,例如(1,2,3) * 5 = (5,10,15)

操作符中也有一元操作符,包括负数运算符“-”和平方运算符“:”,其操作数可以为标量和向量。(向量取平方运算符时表示为每一位都取平方,例如:(1, 2, 3) = (1, 4, 9),标量取平方时即数学意义上的平方,例如*:4 = 16)

求和运算符“+/”,该运算符只能作用于向量,能让向量求和为标量,例如+/(1,2,3) = 6

J操作符的运算顺序为从右到左,并且忽略优先级,需要优先计算的部分将用括号改变优先顺序(允许嵌套括号)。

小H化简的J语言还有一个限制——最高阶数的限制,我们这样定义一个表达数的阶数:

标量(数字, ‘N’ ,求和运算符“+/”的结果)的阶数为0

'X’的复杂度为1 ;

加减法的阶数是其操作数的阶数的最大值;

乘法的阶数是其操作数的阶数的总和;

一元平方的阶数是其操作数的阶数的两倍。

例如,表达式“(3-+/::X)-X**:X”的阶数是3 ,而它的子表达式“::X”的阶数是4 。

小H找到了一道以前写过简化版J语言的表达式,但是别忘了小H只是喜欢思考而不喜欢计算。现在,小H想请你帮他计算一下给定表达式的答案,并且将最终答案取模109(必须保证结果非负,即如果求余后是负数要加上109), 当然小H还清晰的记得他写下的表达式在运算过程中阶数不会超过10。

Input

第一行包含一个整数N,表示向量X的长度

第二行包含N个整数表示向量X的组成部分。

第三行表示待计算的表达式。

数据保证求和运算符不会使用在标量上,保证出现的数字不会超过10^9。

Output

输出一个整数,表示表达式的答案,结果取模10^9

Sample Input

Sample1

5

1 2 3 4 5

+/*:X

Sample2

5

1 2 3 4 5

N++/X-X+1

Sample3

3

11 56 37

+/(3-+/::X)-X**:X

Sample4

3

1 2 3

10++/X

Sample Output

Sample1

55

Sample2

0

Sample3

964602515

Sample4

16

Data Constraint

40%数据,n<=10

60%数据,n<=100,长度<=100

100%数据,n<=100000,长度<=100000

找到了一个好代码(不是本人的)

{$inline on}
{$M 1000000,0,maxlongint}//扩大系统栈,不会打人工的
const
        maxn=1000000000;
type
        arr=array[0..10] of int64;
var
        now:int64;
        s:ansistring;
        s1,s2:string[1];
        n,i,j,o,xi:longint;
        sum:array[0..10] of int64;
        p,last:array[0..10] of int64;
        a,l,pre,zhan:array[0..100000] of int64;
function dg(l,r:longint):arr;  inline;
var
        k:longint;
        wait:string[1];
begin
        k:=r;
        fillchar(dg,sizeof(dg),0);

        if s[k]='X' then
        begin
                dg[1]:=1; dec(k);
        end
        else
        if s[k]='N' then
        begin
                dg[0]:=n; dec(k);
        end
        else
        if s[k]=')' then
        begin
                dg:=dg(pre[k]+1,k-1);
                k:=pre[k]-1;
        end
        else
        if (ord(s[k])>=48) and (ord(s[k])<=57) then
        begin
                now:=0; xi:=1;
                while (k>0) and (ord(s[k])>=48) and (ord(s[k])<=57) do
                begin
                        now:=now+(ord(s[k])-48)*xi;

                        xi:=xi*10; dec(k);
                end;

                dg[0]:=now;
        end;//初始值

        wait:='';

        while k>=l do
        begin
                if s[k]='^' then
                begin
                        fillchar(last,sizeof(last),0);

                        for i:=0 to 10 do
                            if dg[i]<>0 then
                                for j:=0 to 10 do
                                    if dg[j]<>0 then
                                        last[i+j]:=(last[i+j]+dg[i]*dg[j]) mod maxn;
                        dg:=last;

                        dec(k); continue;
                end;
                if s[k]='#' then
                begin
                        now:=dg[0]*n;
                        for i:=1 to 10 do
                                now:=(now+sum[i]*dg[i]) mod maxn;

                        fillchar(dg,sizeof(dg),0);
                        dg[0]:=now;

                        dec(k); continue;
                end;
                if (s[k]='-') and not (s[k-1] in ['X','N',')','0'..'9']) then
                begin
                        for i:=0 to 10 do
                                dg[i]:=-dg[i];

                        dec(k); continue;
                end;//一元运算符

                wait:=s[k];

                dec(k);

                fillchar(p,sizeof(p),0);

                if s[k]='X' then
                begin
                        p[1]:=1; dec(k);
                end
                else
                if s[k]='N' then
                begin
                        p[0]:=n; dec(k);
                end
                else
                if s[k]=')' then
                begin
                        p:=dg(pre[k]+1,k-1);
                        k:=pre[k]-1;
                end
                else
                if (ord(s[k])>=48) and (ord(s[k])<=57) then
                begin
                        now:=0; xi:=1;
                        while (k>0) and (ord(s[k])>=48) and (ord(s[k])<=57) do
                        begin
                                now:=now+(ord(s[k])-48)*xi;

                                xi:=xi*10; dec(k);
                        end;

                        p[0]:=now mod maxn;
                end;

                if wait='+' then
                        for i:=0 to 10 do
                                dg[i]:=(dg[i]+p[i]) mod maxn;

                if wait='-' then
                        for i:=0 to 10 do
                                dg[i]:=(p[i]-dg[i]) mod maxn;

                if wait='*' then
                begin
                        fillchar(last,sizeof(last),0);
                        for i:=0 to 10 do
                            if dg[i]<>0 then
                                for j:=0 to 10 do
                                    if p[j]<>0 then
                                        last[i+j]:=(last[i+j]+dg[i]*p[j]) mod maxn;

                        dg:=last;
                end;

                wait:='';
        end;
end;
begin
        assign(input,'s.in');reset(input);

        readln(n);

        for i:=1 to n do
        begin
                read(a[i]); l[i]:=a[i];
        end;

        readln;

        sum[0]:=1;

        for i:=1 to 10 do
                for j:=1 to n do
                begin
                        sum[i]:=(sum[i]+l[j]) mod maxn;
                        l[j]:=l[j]*a[j] mod maxn;
                end;

        readln(s);

        while (s[1]='(') and (s[length(s)]=')') do
        begin
                delete(s,1,1);
                delete(s,length(s),1);
        end;

        o:=1; s1:='#';

        while o<=length(s)-1 do
        begin
                if (s[o]='+') and (s[o+1]='/') then
                begin
                        delete(s,o,2);
                        insert(s1,s,o);
                end;

                inc(o);
        end;

        o:=1; s2:='^';

        while o<=length(s)-1 do
        begin
                if (s[o]='*') and (s[o+1]=':') then
                begin
                        delete(s,o,2);
                        insert(s2,s,o);
                end;

                inc(o);
        end;//替换符号长度为2的

        for i:=length(s) downto 1 do //预处理括号位置
                if s[i]=')' then
                begin
                        inc(zhan[0]);
                        zhan[zhan[0]]:=i;
                end
                else
                if s[i]='(' then
                begin
                        pre[zhan[zhan[0]]]:=i;
                        dec(zhan[0]);
                end;

        last:=dg(1,length(s));
        writeln((last[0]+maxn*10) mod maxn);
end.

第四题

中山市选2014】图
构造题,看不懂,放弃。

大佬:100+100+无+100=300
我:0+72.5+无+无=72.5

蒟死了!!!

发布了16 篇原创文章 · 获赞 2 · 访问量 1529

猜你喜欢

转载自blog.csdn.net/jay_zai/article/details/104021510