NOIP2017普及组题

提高组死亡选手来AK普及(耗时两天)。

T1

#include<bits/stdc++.h>
using namespace std;
int A,B,C;
int main()
{
    cin>>A>>B>>C;
    cout<<(A*2+B*3+C*5)/10<<"\n";
    return 0;
}

T2

无脑找答案

#include<bits/stdc++.h>
using namespace std;
int N,Q,a[1050],b,x,t;
int main()
{
    cin>>N>>Q;
    for(int i=1;i<=N;i++)cin>>a[i];
    sort(a+1,a+N+1);
    while(Q--){
        cin>>b>>x;
        t=pow(10,b);
        int ans=-1;
        for(int i=1;i<=N;i++)
            if(a[i]%t==x){
                ans=a[i];
                break;
            }
        cout<<ans<<"\n";
    }
    return 0;
}    

T3

连边,取一个有颜色的块,

1.四周有颜色的块 相同连0 不同连1

2.与他距离为2的块 相同连2 不同连3

3.这一点忘了就少一半分,四周没有颜色的块要连2,否则有好多都会误判成“-1”

然后跑SPFA,没了

                        #include<bits/stdc++.h>
using namespace std;
int N,M,color[105][105],last[10005],cnt,
x,y,z,d1[4]={1,-1,0,0},d2[4]={0,0,-1,1},dis[10005];
int D1[8]={0,0,2,-2,1,1,-1,-1},D2[8]={2,-2,0,0,1,-1,1,-1};
bool vis[10005];
queue <int> q;
struct Edge{
    int other,pre,val;
}e[100005];
void connect(int x,int y,int z){
    e[++cnt]=(Edge){y,last[x],z};
    last[x]=cnt;
}
int main()
{
    cin>>M>>N;
    for(int i=1;i<=N;i++){
        cin>>x>>y>>z;
        color[x][y]=z+1;        //0 nah 1 red 2 yellow
    }
    for(int i=1;i<=M;i++)
        for(int j=1;j<=M;j++)
            if(color[i][j]){
                for(int k=0;k<=3;k++){
                    int tx=i+d1[k],ty=j+d2[k];
                    if(tx<1||tx>M||ty<1||ty>M)continue;
                //    printf("[%d,%d]\n",tx,ty);
                    if(color[tx][ty]){
                        int v=1;
                        if(color[tx][ty]==color[i][j])v=0;
                //        printf("(%d,%d)->(%d,%d)cost=%d\n",i,j,tx,ty,v);
                        connect((i-1)*M+j,(tx-1)*M+ty,v);
                    }
                    else {
                        connect((i-1)*M+j,(tx-1)*M+ty,2);//    printf("z(%d,%d)->(%d,%d)cost=%d\n",i,j,tx,ty,2);
                    }
                }
                for(int l=0;l<=7;l++){
                    int lx=i+D1[l],ly=j+D2[l];
                    if(lx<1&&lx>M&&ly<1&&ly>M)continue;
                    if(lx==i&&ly==j)continue;
                    if(!color[lx][ly])continue;
                    int v=3;
                    if(color[i][j]==color[lx][ly])v=2;
                //    printf("(%d,%d)->(%d,%d)cost=%d\n",i,j,lx,ly,v);
                    connect((i-1)*M+j,(lx-1)*M+ly,v);
                }
            }
    memset(dis,0x3f,sizeof dis);
    vis[1]=1,dis[1]=0;
    q.push(1);
    while(!q.empty()){
        int u=q.front();
        vis[u]=0,q.pop();
        for(int i=last[u];i;i=e[i].pre){
            int v=e[i].other;
            if(dis[v]>dis[u]+e[i].val){
                dis[v]=dis[u]+e[i].val;
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    if(dis[M*M]==dis[0])puts("-1");
    else printf("%d\n",dis[M*M]);
    return 0;
}
                    

T4

二分答案+DP

朴素DP N^2  我们很容易的看出可以拿单调队列优化

#include<bits/stdc++.h>
#define MAXN 500005
#define INF 0x7f7f7f7f
using namespace std;
int read(){
    int x=0,t=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*t;
}
int N,D,K,x[MAXN],c[MAXN],f[MAXN];
pair <int,int> q[MAXN];
bool Judge(int L){
    memset(f,0,sizeof f);
    int a=D-L,b=D+L,head=0,tail=-1,cur=0;
    if(a<=0)a=1;
    for(int i=1;i<=N;i++){
        for(cur;cur<i&&x[cur]<=x[i]-a;cur++){
            while(head<=tail&&q[tail].first<f[cur])tail--;
            if(f[cur]<=-INF)continue;
            q[++tail].first=f[cur],q[tail].second=x[cur];
        }
        while(head<=tail&&x[i]-q[head].second>b)head++;
        if(head<=tail)f[i]=q[head].first+c[i];
        else f[i]=-INF;
        if(f[i]>=K)return 1;
    }
    return 0;
}
int main()
{
    N=read(),D=read(),K=read();
    for(int i=1;i<=N;i++)x[i]=read(),c[i]=read();
    if(!Judge(x[N]))puts("-1");
    else{
        int l=0,r=x[N];
        while(l<r){
            int mid=l+r>>1;
            if(Judge(mid))r=mid;
            else l=mid+1;
        }
        printf("%d\n",l);
    }
    return 0;
} 
时间: 2024-10-07 23:13:08

NOIP2017普及组题的相关文章

【NOIP2017普及组】赛后心得

我觉得可能今生再也见不到这么简单的题目了--甚至有种能AK的错觉(不 然而考场上脑壳疼了,只剩下310~330. T4告诉我以后遇到不会的东西一定要早点学-- 题目分析 T1 分数 这次连模拟都不用了,干脆叫你输出三个数的和. 要不明年直接改成A+B Problem好了. T2 图书管理员 不难,就是坑,特别坑. 如果有前导零会坑死一堆人,可能很多人没AK不会在T4而是T2(笑). 不过我还是相信CCF不会像kpm一样出前导零. 要是出了我就完了. T3 棋盘 简单到不行啊--直接暴搜一遍即可,

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

noip2008普及组3题题解-rLq

(第一次写题解,随意喷) (只是前一天的作业哈) (先凑个数) 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目.聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次

noip2008普及组4题题解-rLq

(啊啊啊终于补到了今天的作业了) 本题地址:http://www.luogu.org/problem/show?pid=1058 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图.小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:每个顶

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

05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样

【基础练习】【卡特兰数】栈 2003年NOIP全国联赛普及组第三题 题解

卡特兰数,这是一向掌握不大熟练的内容,今天借NOIP2003普及组的第三题来总结一下.当然由于原题数据弱抱,不需要高精.如果有时间我会不断补充这篇文章里的内容. 二话不说上代码 //Catalan #include<iostream> using namespace std; long long n,f[20]={0}; /*NO.1 f[n+1]=f[i]*f[n-i]from 0 to n plus f[0]=1 int main(){ cin>>n; f[0]=1;f[1]=

守望者的逃离(2007年普及组第3题)| 贪心算法

守望者的逃离(2007年普及组第3题) [问题描述] 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率深藏在海底的那加企图叛变,守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去,到那时岛上的所有人都会遇难:守望者的跑步速度为17m/s, 以这样的速度是无法逃离荒岛的.庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点.守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复.

普及组2006第三题jam的计数法

P1061 Jam的计数法 题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩. 在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母.我们把这样的"数字"称为Jam数字.在Jam数字中,每个字母互不相同,而且从左到右是严格递增的.每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母.

2017年11月1日刷题记录 | 普及组

写在前面 哇Cys好菜啊! 哇Cys连普及组都不会打了啊! 哇要Noip了好紧脏啊! 哇Cys要开始刷题了 然后重点是Cys好菜菜菜菜菜菜啊!!!! 以下题目来自题库比赛 Task-1  A-B 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数.(不同位置的数字一样的数对算不同的数对) 输入输出格式 输入格式: 第一行包括2个非负整数N和