【11.13】57のTest

来源:互联网 发布:qq空间克隆软件 编辑:程序博客网 时间:2024/05/05 20:24

Orz 57

考试结果不重要啦
学会了什么才是关键~

愿每个坚持梦想的你都足够坚强

T0
写在正式题解之前
说一下这次考试中出现的问题
①文件操作错误
文件操作写在main函数开头,格式为:

freopen(" ","r",stdin);//空格为输入文件名freopen(" ","w",stdout);//空格为输出文件名

考试结束前,一个个程序打开看是否打对

以及记得:

fclose(stdin);fclose(stdout);

不然有可能无输出

②命名错误
本次三个题目命名分别为:①data.cpp ②std.cpp ③baoli.cpp
命名不是中文……

③文件交错或者没交上
cena使用:安装后右键单击任务栏小地球图标,会有选项
点开即可设置选手文件夹地址
就是告诉它你把程序存在哪个文件夹了
考试结束前看仔细,确定自己交对了文件
选手文件夹中只保留.cpp后缀的文件,不要把.exe或者其他神奇的东西放进去……

④超出内存限制(MLE)

int数组最多三千二百万! 提前算好!看清题目要求的内存限制!!

╭(╯^╰)╮下次谁MLE谁唱歌

⑤运行错误(RE)&&编译错误(CE)
交程序之前在自己电脑上运行一下……至少过个样例QAQ
本机没问题的话,检查自己格式是I64d还是lld,是否符合题目标准
检查是否访问不合法内存,比如a[-1]
比如开了a[233]却访问了a[666];

⑥答案格式错误(PE)

认真读题认真读题认真读题!!!

分清空格和换行!!!

⑦审题错误
虽然你学长学姐们都语文不好……但是这次题面特别良心!!!
都告诉你们了!!!

”(-1)mod(10007) = 10006

数据全为手动构造,请酌情骗分“

没看见的面壁思过╭(╯^╰)╮
看错题了的面壁思过╭(╯^╰)╮
审题失败的面壁思过╭(╯^╰)╮

都知道重要的事情说三遍
那你读题倒是读三遍呀QAQ
QAQ没读懂就再读呀
别当小说看个没完就行……

⑧奇怪的错误
多组数据读入,记得把用到的数组啊答案啊变量啊都清空
崩溃或者栈溢出 递归死循环了QAQ
不知道哪里错了就调试,中间输出也是很管用的

⑨爆零
我为什么写上这个呢……
因为这次考试可以输出-1骗分
不会做没关系
骗分骗不到就要好好思考人生了

骗分技巧://会做就别骗分了,注意细节就好

前提:不是多组数据

输出为yes或者no,选一个输出
能输出-1,就直接输出-1
if(输入为样例) 输出样例答案╮(╯▽╰)╭说不定有分呢2333
数据分点,数据规模有梯度,能做多少做多少,暴力一定打对
根据数据梯度写分段函数,就是判断一下n属于哪个范围然后调用哪里
if(n < 233) baoli();之类的

注意做题顺序,并不是每次考试都保证题目难度递增

就算它递增,对于你来说也不一定

╮(╯▽╰)╭好啦我终于总结完了2333
和当年的我们一样
谁不是这么过来的呢
不怕不怕
一切才刚开始呢233333

T1

使一个矩形满足行列两条对角线的和都为同一个数
不满足输出”-1“;

注意:
1.每块土地能量值>0
所以处理出<=0就可以输出-1了//如果你没打错的话23333╮(╯▽╰)╭

2.n == 1时输出1

3.处理和的时候注意行列对角线之间的区别
比如num[i][j]
同一行则坐标中i相同
同一列则坐标中j相同

对角线呢?
╮(╯▽╰)╭自己画图看呀
//这里存图从1开始
//第一条:num[1][1] num[2][2]…… num[n][n]
//第二条:num[1][n] num[2][n - 1]……num[n][1]

定义某一行为不含未知数(答案)的行
某一列同上x
当前行为含未知数的行
当前列同上x

未知数 = 某一行的和 - 当前行的和
未知数 = 某一列的和 - 当前列的和

然后对角线?
你自己想~~~~嘿嘿嘿

std如下:
//╮(╯▽╰)╭std都不是我写的

#include<iostream>#include<cstdio>using namespace std;typedef long long ll;ll map[600][600],s1[600],s2[600];int main(){    freopen("data.in", "r", stdin);    freopen("data.out", "w", stdout);    ll n,x,y,sx=0,sy=0,st=0;    cin>>n;    for(int i=0; i<n; i++)    {        for(int j=0; j<n; j++)        {            cin>>map[i][j];            if(map[i][j]==0)x=i,y=j;            s1[i]+=map[i][j];            s2[j]+=map[i][j];        }        sx+=map[i][i];        sy+=map[i][n-i-1];    }    if(x==0)st=s1[1];    else st=s1[0];    bool b=1;    if(s1[x]!=s2[y])b=0;    if(x!=y&&sx!=st)b=0;    if(n-x!=y+1&&sy!=st)b=0;    if(b)for(int i=0; i<n; i++)        {            if(x!=i&&s1[i]!=st)            {                b=0;                break;            }            if(y!=i&&s2[i]!=st)            {                b=0;                break;            }        }    ll ans=st-s1[x];    if(ans<=0)b=0;    if(x==y&&ans+sx!=st)b=0;    if(n-x==y+1&&ans+sy!=st)b=0;    if(n==1)cout<<1;    else if(!b)cout<<-1;    else cout<<ans;    return 0;}

T2

字符串处理

两个问题:
括号外最长单词长度
括号内单词总数

这就意味着对于括号的细节处理要小心啦

括号内外如何区别?
碰到了左括号不就代表着要进括号里了吗~
发现了右括号不就代表着要到括号外了吗~

下划线?
下划线判断单词数 ans ++;

最后一个单词?
最后一个字符并不一定是下划线,所以最后一个单词很可能会有bug
①特判
②字符串是支持+=的还记得吗
比如 string a = “233”;
string b = “666”;
a += b; cout << a;
然后你会得到233666
所以加个下划线就好了

有多个答案输出的题目请务必注意输出格式!看清楚是换行还是空格!!

附赠std:
//╮(╯▽╰)╭我不生产std,我只是std的搬运工

//Codeforces Round #375 (Div. 2) B#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int maxn=20000;char hah[maxn];int l[maxn];int r[maxn];int n;int ans2=0;void haha(int ll,int rr){    for(int i=ll+1;i<rr;)    {        if(hah[i]=='_')        i++;        else        {            ans2++;            while(hah[i]!='_'&&i<rr)            {                i++;            }        }    }}int main(){    freopen("std.in","r",stdin);    freopen("std.out","w",stdout);    int ans1=0;    scanf("%d",&n);    int lc=0;    int rc=0;    for(int i=1;i<=n;i++)    {        cin>>hah[i];        if(hah[i]=='(')        {            l[++lc]=i;        }        if(hah[i]==')')        {            r[++rc]=i;        }    }    for(int i=1;i<=n;)    {        if(hah[i]=='_')        {            i++;        }        else if(hah[i]=='(')        {            while(i<=n)            {                i++;                if(hah[i]==')')                break;            }        }        else         {            if(hah[i]==')')            i++;            int cnt=0;            while(hah[i]!='_'&&hah[i]!='('&&i<=n)            {                i++;                cnt++;            }            ans1=max(ans1,cnt);        }    }    for(int i=1;i<=lc;i++)    {        haha(l[i],r[i]);    }    cout<<ans1<<" ";    printf("%d",ans2);    return 0;}

T3

表达式运算
用两个栈,一个存运算符,一个存数字
具体请参见蓝色课件,这是例题

注意:(-1)mod(10007) = 10006

附赠std:
//╮(╯▽╰)╭课件上那个看不懂的话来问四楼们

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cstdlib>using namespace std;const long long MAXN = 100000 + 5;const long long P = 10000 + 7;struct dot{    char op;    long long l,r;    long long num;}tree[MAXN];char s[MAXN];long long n;long long mod(long long x){    return x;}namespace no_X{    bool yes()    {        for(long long i = 0;i < n;i ++)            if(s[i] == 'x')                return false;        return true;    }    bool is_a_num(long long l,long long r)    {        for(long long i = l;i <= r;i ++)            if(!isdigit(s[i]))                return false;        return true;    }    long long make_num(long long l,long long r)    {        long long ans = 0;        for(long long i = l;i <= r;i ++)            ans = ((ans << 1) + (ans << 3) + (s[i] - '0'));        return ans;    }    long long sz = 0;    long long build(long long l,long long r)    {        if(is_a_num(l,r))        {            long long x = ++ sz;            tree[x].num = make_num(l,r);            return x;        }        long long flag = 0;        long long c1 = -1,c2 = -1;        for(long long i = l;i <= r;i ++)        {            switch(s[i])            {                case '(':flag ++;break;                case ')':flag --;break;                case '+':case '-':if(!flag)c1 = i;break;                case '*':case '/':if(!flag)c2 = i;break;            }        }        if(c1 < 0)c1 = c2;        if(c1 < 0)return build(l + 1,r - 1);        long long x = ++sz;        tree[x].op = s[c1];        tree[x].l = build(l,c1 - 1);        tree[x].r = build(c1 + 1,r);        return x;    }    long long ask(long long x)    {        if(!tree[x].op)            return tree[x].num;        long long ans = 0;        switch(tree[x].op)        {            case '+':ans = ask(tree[x].l) + ask(tree[x].r);break;            case '-':ans = ask(tree[x].l) - ask(tree[x].r);break;            case '*':ans = ask(tree[x].l) * ask(tree[x].r);break;            case '/':                long long a = ask(tree[x].l);                long long b = ask(tree[x].r);                if(!b)                {                    puts("10007");                    exit(0);                }                ans = ask(tree[x].l) / ask(tree[x].r);                break;        }        return ans;    }    void solve()    {        long long root = build(0,n - 1);        printf("%lld\n",ask(root));    }}int main(){    freopen("baoli.in","r",stdin);    freopen("baoli.out","w",stdout);    gets(s);    n = strlen(s);    no_X::solve();    fclose(stdin);    fclose(stdout);    return 0;}

好啦题解写完啦~
还有没听懂没看懂的来问四楼~
什么时候都保证有人

2016NOIP

加油,所有人

愿世界对你温柔以待❤
愿你对生活仍有期待❤

Orz you all

2016.11.13
LOI_summer

0 0