考试技巧

1.拿到考卷首先通看题目,按自己感觉的难度排序(普及一般是1-2-3-4了~还是相信出题人不会坑我们的2333)

2.一般来说,普及组前两道题比较简单(大水题啊233~),但是通常坑很多,例如NOIP2000计算器的改良一题….非常坑,需要注意1.未知数从A-z中的任意一个字母2.字母系数为1时可以省略….因此要多读3遍题,切记仔细读题,一个字都不能放过。before that think twice and double check you code.(多想几遍然后反复检查代码了~)

3.处理完T1,T2就来到有(ju)趣(ken)的T3了~一般来说普及组的T3 还是挺水的通常思考5~20分钟就能思考出来。然而实现的坑也不比T1,T2。通常T3会让我们进行一些模运算和long long运算。别看这些都这么简单,然而这就是出题老师将100分坑成20分的得力工具啊233~先说long long:在一个运算公式里,要得到long long的结果,一般要让加入运算的所有都开long long(一定要注意是全开long long!!),否则100变50-。再说取模运算:并不是所有的运算都可以乱%的,一定要先判断是否对结果有影响再%,另外记住一点——能%的地方一定不要放过。

4.接着就是T4了,这种题一般都不能得满分的,毕竟还是有难度(像我这种蒟蒻就更做不起了233…),建议是按题目的数据范围一步步优化,尽量拿更高的分数

考试模版

考试专供

随机数据生成器

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
int num[1000005];
int main()
{
    srand(time(NULL));
    freopen("begining.out","w",stdout);
    int n=(rand()%10000)+1;
    printf("%d\n",n);
    for(int i=1;i<=n;i++)
    {
        num[i]=rand()%10000;
    }
    sort(num+1,num+n+1);
    for(int i=1;i<=n;i++)printf("%d ",num[i]);
}

对拍程序

bat版

先新建一个记事本文档;

在文档中写:

@echo off
:loop
begining.exe > data.out
start.exe < data.out > start.out
std.exe < data.out > std.out
fc start.out std.out
if not errorlevel 1 goto loop
pause
goto loop

c++版(推荐)

#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
    int testdata=100;
    while(1)
    {
        testdata--;
        system("data.exe > data.txt");
        system("biaoda.exe < data.txt > biaoda.txt");
         system("test.exe < data.txt > test.txt");
        if(system("fc test.txt biaoda.txt"))   break;
    }
    if(testdata==0) cout<<"no error"<<endl;
    else cout<<"error"<<endl;
    system("pause");
    return 0;
}  

读入优化

int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}  

算法——排序

sort版

#include<iostream>
#include<algorithm>
using namespace std;
long long n,a[100000];
int main()
{
    scanf("%lld",&n);
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    for(int i=0;i<n-1;i++) cout<<a[i]<<' ';
    cout<<a[n-1];
    return 0;
}

快速排序

从小到大

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int a[100005];
int l,n,m,cont,c;
void quicksort(int x,int y)
{
    int l=x,r=y,mid;
    mid=a[(l+r)/2];
    while(l<=r)
    {
        while(a[l]<mid)l++;
        while(a[r]>mid)r--;
        if(l<=r){swap(a[l],a[r]);l++;r--;}
    }
    if(x<r)quicksort(x,r);
    if(y>l)quicksort(l,y);
}
int main()
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    quicksort(1,n);
    for(i=1;i<=n;i++)printf("%d ",a[i]);
}

归并排序

从小到大

#include<iostream>
#include<cstdio>
using namespace std;
int a[100005],s[100005];
long long cont;
void merge(int st,int m,int ov)
{
    int l=st,r=m+1,q=0;
    while(l<=m&&r<=ov)
    {
        if(a[l]<=a[r])s[q++]=a[l++];
        else {s[q++]=a[r++];cont+=m-l+1;}
    }
    while(l<=m)s[q++]=a[l++];
    while(r<=ov)s[q++]=a[r++];
    for(int i=st;i<=ov;i++)a[i]=s[i-st];
}
void mergesort(int st,int ov)
{
    if(st<ov)
    {
        int mid=(st+ov)/2;
        mergesort(st,mid);
        mergesort(mid+1,ov);
        merge(st,mid,ov);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    mergesort(1,n);
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
    printf("\n");
    //printf("%lld",cont);//本输出用于求逆序对
}

数据结构

优先队列

#include<queue>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
priority_queue<int> QAQ;
int n,x,a;
int main(){

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==1){scanf("%d",&a);QAQ.push(-a);}
        if(x==2)printf("%d\n",-QAQ.top());
        if(x==3)QAQ.pop();
    }
}

并查集

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,fa[10005],z,x,y;
int find(int p)
{
    if(fa[p]!=p)fa[p]=find(fa[p]);
    return fa[p];
}
void bin(int x1,int y1)
{
    fa[x1]=y1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&z,&x,&y);
        int ta=find(x),tb=find(y);
        if(z==1)
        {
            if(ta==tb)continue;
            else bin(ta,tb);
        }
        if(z==2)
        {
            if(ta==tb)printf("Y\n");
            else printf("N\n");
        }
    }
}

根据两种遍历顺序确定树结构

#include<cstdio>
#include<iostream>
#include<climits>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
string s1,s2;
void xfind(int len1,int re1,int len2,int re2)
{
    int m=s2.find(s1[len1]);
    if(m>len2)xfind(len1+1,len1+m-len2,len2,m-1);
    if(m<re2)xfind(len1+m-len2+1,re1,m+1,re2);
    printf("%c",s1[len1]);
}
int main()
{
    cin>>s1>>s2;
    xfind(0,s1.length()-1,0,s2.length()-1);
    return 0;
}

图论

有向图的DFS

#include<iostream>
#include<algorithm>
#include<climits>
#include<vector>
using namespace std;
struct node
{
    int v,next;
}a[20010];
int b[205];
int n,m,maxx,s,num;
bool visit[205];
int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
void fpush(int from,int to)
{
    a[++num].v=to,a[num].next=b[from],b[from]=num;
}
void dfs(int j)
{
    visit[j]=1;maxx++;
    for(int i=b[j];i;i=a[i].next)
        if(visit[a[i].v]==0)dfs(a[i].v);
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++)
    {
        int u,v;
        u=read();v=read();
        fpush(u,v);
    }
    s=read();
    dfs(s);
    printf("%d",maxx);
} 

无向图的BFS

#include<iostream>
#include<cstring>
using namespace std;
int n,m,k,head=0,tail=1,a[205],s;
bool b[205],ks[205][205];
int main()
{
    memset(b,0,sizeof(b));
    memset(a,0,sizeof(a));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        ks[u][v]=1;
        ks[v][u]=1;
    }
    scanf("%d",&s);
    printf("%d",s);
    a[1]=s;
    b[s]=1;
    while(head!=tail)
    {
        head++;
        int kk=a[head];
        for(int i=1;i<=n;i++)
        {
            if(!b[i]&&ks[kk][i]==1)
            {
                printf(" %d",i);
                tail++;
                a[tail]=i;
                b[i]=1;
            }
        }
    }
    return 0;
}

哈密顿环

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>a[205];
bool visit[205],flag=1;
int x,n,ans,start=1;
void dfs(int s,int deep)
{
    if(deep==n)ans++;
    for(int i=0;i<a[s].size();i++)
        if(!visit[a[s][i]])
        {
            visit[a[s][i]]=1;
            dfs(a[s][i],deep+1);
            visit[a[s][i]]=0;
        }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&x);
            if(x==1)a[i].push_back(j);
        }
    for(int i=1;i<=n;i++)
    visit[i]=1,dfs(i,1),visit[i]=0;
    printf("%d",ans);
}

欧拉回路

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool k[105][105],flag=1;
int x,n,du,sum,ff[10005],start=1,p;
void dfs(int s)
{
    for(int i=1;i<=n;i++)
        if(i!=s&&k[s][i])
        {
            k[s][i]=0;k[i][s]=0;
            dfs(i);
        }
    ff[++p]=s;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        du=0;
        for(int j=1;j<=n;j++)
        {
            scanf("%d",&x);
            if(x==1){k[i][j]=1;du++;}
            else k[i][j]=0;
        }
        if(du%2==1){if(!sum)start=i;sum++;}
    }
    if(sum>2){printf("No Solution!\n");return 0;}
    dfs(start);
    printf("%d",ff[p]);
    for(int i=p-1;i>=1;i--)printf(" %d",ff[i]);
}

最小生成树

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node
{
    int x,y,price;
}a[200005];
int n,m,p,u,v,father[5005],x,y,num,ans,ksum;
bool cmp(node s1,node s2)
{
    return s1.price<s2.price;
}
int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int find(int p)
{
    if(father[p]!=p)father[p]=find(father[p]);
    return father[p];
}
void bin(int p1,int p2)
{
    father[p2]=p1;
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)bin(i,i);
    for(int i=1;i<=m;i++)
            u=read(),v=read(),a[++num].price=read(),a[num].x=u,a[num].y=v;
    sort(a+1,a+num+1,cmp);
    for(int i=1;i<=num;i++)
    {
        if(ksum==n-1)break;
        int s1=find(a[i].x),s2=find(a[i].y);
        if(s1!=s2)
        {
            bin(s1,s2);
            ans+=a[i].price;
            ksum++;
        }
    }
    if(ksum==n-1)printf("%d\n",ans);
    else printf("orz\n");
}

SPFA

#include<cstdio>
#include<queue>
#include<climits>
using namespace std;
int b[10005],vis[10005],now,x,y,z,xnext,cnt,m,n,s,en,d[10005],cont,flag=1;
queue<int>a;
struct node
{
    int next,to,w;
}e[500005];
void fpush(int u,int v,int w)
{
    e[++cnt].next=b[u];
    e[cnt].w=w;
    e[cnt].to=v;
    b[u]=cnt;
}
void SPFA()
{
    a.push(s);
    d[s]=0;
    while(!a.empty())
    {
        cont++;
        now=a.front();
        a.pop();
        vis[now]=0;
        for(int i=b[now];i;i=e[i].next)
        {
            xnext=e[i].to;
            if(d[now]+e[i].w<d[xnext])
            {
                d[xnext]=d[now]+e[i].w;
                if(!vis[xnext])
                {
                    a.push(xnext);
                    vis[xnext]=true;
                }
            }
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n;i++)
        d[i]=INT_MAX/2;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        fpush(x,y,z);
    }
    SPFA();
    for(int i=1;i<=n;i++)
        if(d[i]!=INT_MAX/2)printf("%d ",d[i]);
        else printf("2147483647 ");
    return 0;
}

数论

gcd

int gcd(int m,int n)
{
    while(m>0)
    {int c=n%m;n=m,m=c;}
    return n;
} 

线性筛素数

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,l,r;
bool isPrime[10000005];
int main()
{
    scanf("%d%d",&m,&n);
    memset(isPrime,0,sizeof(isPrime));
    isPrime[1]=true;
    for(int i=2;i<=sqrt(m);i++)
    {
        if(isPrime[i]==0)
        {
            for(int j=2*i;j<=m;j+=i)
            isPrime[j]=true;
        }
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&r);
        if(!isPrime[r])
        printf("Yes\n");
        else
        printf("No\n");
    }
}

[NOIP2017赛前复习第二期]复赛考试技巧与模版-普及组的更多相关文章

  1. 寻找大学目标及行动步骤——记ITAEM团队第二期宣讲会(2014.05.14)

    ·昨晚8:00-9:40.在 钟海楼03029 ,进行了ITAEM团队第二期宣讲会(第一期见第一期宣讲会总结).来參加的主要是大一学生.以信院为主.也有法学院.文学院的同学. 在宣讲会中,大家都比較积 ...

  2. 20155320信息安全系统设计第二周课堂考试总结及myod的实现

    20155320 信息安全系统设计第二周课堂考试总结及myod的实现 第二周测试一二已在课上提交 第二周测试3-gdb测试 用gcc -g编译vi输入的代码 在main函数中设置一个行断点 在main ...

  3. 小象学院Python数据分析第二期【升级版】

    点击了解更多Python课程>>> 小象学院Python数据分析第二期[升级版] 主讲老师: 梁斌 资深算法工程师 查尔斯特大学(Charles Sturt University)计 ...

  4. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  5. 05:统计单词数【NOIP2011复赛普及组第二题】

    05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次 ...

  6. 智能生活 科技无限 CTO VOICE 第二期 智能硬件创新创业专场演讲嘉宾招募

    生活不只有诗和远方,还有当下的痛点和需求 当可穿戴设备.虚拟现实.无人机.机器人进入人们视线甚至生活当中 下一个风口就在智能硬件领域上凸显 那么,创业者如何撕掉智能外衣,设计一款有竞争力的智能硬件? ...

  7. 下载频道--IT资源关东煮第二期[申明:来源于网络]

    下载频道–IT资源关东煮第二期[申明:来源于网络] 地址:http://geek.csdn.net/news/detail/129509?ref=myread

  8. 《Linux就该这么学》第二期视频

    Linux就该这么学--第二期学习笔记... ------------- 你的未来取决于你现在点点滴滴的努力 需要用到的一些工具: Vm11激活码 ---------- root在Linux系统中相当 ...

  9. 【sky第二期--PID算法】--【智能车论坛】

    [sky第二期--PID算法] 想学PID的可以来[智能车论坛]这里有我发布的资料http://bbs.tekbots.eefocus.com/forum.php?mod=viewthread& ...

随机推荐

  1. Linux 新手应该知道的 26 个命令

    https://linux.cn/article-6160-1.html 当你进入了 Linux 的世界,在下载.安装 了某个 Linux 发行版,体验了 Linux 桌面并安装了一些你喜爱和需要的软 ...

  2. 高性能平滑动画_requestAnimationFrame

    高性能平滑动画_requestAnimationFrame 在下一次重绘之前,执行一个函数

  3. swust oj 984

    利用二叉树中序及先序遍历确定该二叉树的后序序列 1000(ms) 10000(kb) 2754 / 5599 已知二叉树的中序和先序遍历可以唯一确定后序遍历.已知中序和后序遍历可以唯一确定先序遍历,但 ...

  4. c#拷贝整个文件夹到指定文件夹下(非递归)

    public static void CopyEntireDir(string sourcePath, string destPath) { //Now Create all of the direc ...

  5. robot framework + win7 64 上的安装

    1.安装 python 2.7   2.cmd  管理模式 python -m pip install --upgrade pip     pip install robotframework==3. ...

  6. JVM内存模型与垃圾回收

    内存模型 1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器.字节码解 ...

  7. Windows nessus安装

    1.官网下载nessus,下载速度很慢,要有耐心 2.安装,安装完成后访问https://localhost:8834,最好使用chrome浏览器 3.页面注册,更新plugins等 4.如果页面无法 ...

  8. 使用sessionStorage进行数据存值

    <!DOCTYPE html> <head> <meta charset="UTF-8" /> <meta name="view ...

  9. MYSQL 事务和用户权限

    一. 什么是事务:简单说,所谓事务就是一组操作,要么操作都成功要么都不成功. 二.事务的使用流程 1. 第一步:开启一个事务,start transaction; 2. 第二步:正常的SQL语句操作, ...

  10. xmind使用

    按住alt可以使子主题线条拉长: