NOIP2014题解

Day1

生活大爆炸版石头剪刀布 rps

简单模拟题,注意细节

#include<iostream>
#include<cstdio>
using namespace std;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int ans[5][5]={0,-1,1,1,-1,1,0,-1,1,-1,-1,1,0,-1,1,-1,-1,1,0,1,1,1,-1,-1,0};
int n,na,nb,a[500],b[500],A,B;
int main()
{
n=read();na=read();nb=read();
for(int i=0;i<na;++i)a[i]=read();
for(int i=0;i<nb;++i)b[i]=read();
for(int i=0;i<n;++i)
{
int d=ans[a[i%na]][b[i%nb]];
if(d==1)A+=1;if(d==-1)B+=1;
}
printf("%d %d\n",A,B);
return 0;
}

联合权值 link

可以说非常简单了,先算出每个点周围点的权值和,在计算它们的平方和。

答案就是权值和的平方减去平方和。

#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 10007
#define MAX 200200
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int n,W[MAX],ans,S[MAX],SS[MAX];
int main()
{
n=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
for(int i=1;i<=n;++i)W[i]=read();
for(int u=1;u<=n;++u)
{
int mx=0,mxx=0;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;S[u]=(S[u]+W[v])%MOD;SS[u]=(SS[u]+W[v]*W[v])%MOD;
if(W[v]>mx)mxx=mx,mx=W[v];
else if(W[v]>mxx)mxx=W[v];
}
ans=max(ans,mx*mxx);
}
printf("%d ",ans);
ans=0;
for(int i=1;i<=n;++i)ans=(ans+S[i]*S[i])%MOD;
for(int i=1;i<=n;++i)ans=(ans+MOD-SS[i])%MOD;
printf("%d\n",ans);
return 0;
}

飞扬的小鸟 bird

不错的\(dp\)题。

设\(f[i][j]\)表示到达\((i,j)\)位置的最小步数。

转移很显然,类似背包可以不用枚举向上飞的次数。

注意先转移向上飞,因为你至少要飞一次,所以先从\(i-1\)转移飞一次,再在\(i\)行内背包转移。

转移完之后再转移下降的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 10010
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,K,L[MAX],H[MAX],X[MAX],Y[MAX];
int f[MAX][1010],inf;
void cmin(int &x,int y){if(x>y)x=y;}
int main()
{
n=read();m=read();K=read();
for(int i=1;i<=n;++i)X[i]=read(),Y[i]=read();
for(int i=1;i<=n;++i)L[i]=0,H[i]=m+1;
for(int i=1;i<=K;++i)
{
int p=read();
L[p]=read();H[p]=read();
}
memset(f,63,sizeof(f));inf=f[0][0];
for(int i=1;i<=m;++i)f[0][i]=0;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
cmin(f[i][min(j+X[i],m)],f[i-1][j]+1);
for(int j=1;j<=m;++j)
cmin(f[i][min(j+X[i],m)],f[i][j]+1);
for(int j=1;j<=m-Y[i];++j)
cmin(f[i][j],f[i-1][j+Y[i]]);
for(int j=1;j<=L[i];++j)f[i][j]=inf;
for(int j=H[i];j<=m;++j)f[i][j]=inf;
}
int mn=inf;
for(int j=1;j<=m;++j)
if(f[n][j]<1e9)
mn=min(mn,f[n][j]);
if(mn>1e9)
{
for(int i=n-1;i;--i)
for(int j=1;j<=m;++j)
if(f[i][j]<1e9)
{
int sum=0;puts("0");
for(int k=1;k<=i;++k)
if(H[k]<=m)++sum;
printf("%d\n",sum);
return 0;
}
}
else printf("1\n%d\n",mn);
return 0;
}

Day2

无线网络发射器选址 wireless

暴力

#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 150
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int s[MAX][MAX];
int d,n,ans=0,way=0;
int main()
{
d=read();n=read();
for(int i=1;i<=n;++i)
{
int x=read(),y=read(),k=read();
s[x][y]+=k;
}
for(int i=0;i<=128;++i)
for(int j=0;j<=128;++j)
{
int ss=0;
for(int k=max(0,i-d);k<=128&&k<=i+d;++k)
for(int l=max(0,j-d);l<=128&&l<=j+d;++l)
ss+=s[k][l];
if(ans<ss)ans=ss,way=1;
else if(ans==ss)way+=1;
}
printf("%d %d\n",way,ans);
return 0;
}

寻找道路 road

沿着反边\(dfs\)一遍找到所有合法点,再\(bfs\)一遍求答案。实际上只需要存反边就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 10100
#define MAXL 200200
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,S,T;
struct Line{int v,next;}e[MAXL<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
bool vis[MAX],book[MAX];
void dfs(int u)
{
if(vis[u])return;vis[u]=true;
for(int i=h[u];i;i=e[i].next)
if(!(i&1))dfs(e[i].v);
}
int dis[MAX];
void bfs()
{
memset(dis,63,sizeof(dis));
queue<int> Q;Q.push(S);dis[S]=0;
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int i=h[u];i;i=e[i].next)
if((i&1)&&dis[u]+1<dis[e[i].v])
{
if(!book[e[i].v])continue;
dis[e[i].v]=dis[u]+1;
Q.push(e[i].v);
}
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
S=read(),T=read();
dfs(T);
for(int u=1;u<=n;++u)
{
bool fl=true;
for(int i=h[u];i;i=e[i].next)
if((i&1)&&!vis[e[i].v]){fl=false;break;}
book[u]=fl;
}
if(!book[S]){puts("-1");return 0;}
bfs();printf("%d\n",dis[T]);
return 0;
}

解方程 equation

显然没法直接算,所以我们取个模。显然一个模数很假,所以我们多搞几个模数。

显然\(x\)大于模数就不用重复算,所以我们对于每个模数预处理。

然后枚举就做完了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int p[]={10007,10013,10017,10023,10029,10037,10097};
int a[7][105];
char ch[10100];
int n,m;
void get(int id)
{
int l=strlen(ch+1);
for(int i=0;i<7;++i)
{
int x=0,fr=1;bool fl=false;
if(ch[1]=='-')fl=true,fr=2;
for(int j=fr;j<=l;++j)
x=(x*10+ch[j]-48)%p[i];
if(fl)x=(p[i]-x)%p[i];
a[i][id]=x;
}
}
int Calc(int id,int x)
{
int ret=0;
for(int i=0,X=1;i<=n;++i,X=X*x%p[id])
ret=(ret+X*a[id][i])%p[id];
return ret;
}
bool vis[7][20000];
int S[1000100],top;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;++i)scanf("%s",ch+1),get(i);
for(int i=0;i<7;++i)
for(int j=0;j<p[i];++j)
if(Calc(i,j)==0)vis[i][j]=true;
for(int i=1;i<=m;++i)
{
bool fl=true;
for(int j=0;j<7;++j)if(!vis[j][i%p[j]])fl=false;
if(fl)S[++top]=i;
}
printf("%d\n",top);
for(int i=1;i<=top;++i)printf("%d\n",S[i]);
return 0;
}

NOIP2014题解的更多相关文章

  1. [NOIP补坑计划]NOIP2014 题解&做题心得

    六道普及组题,没啥好说的 场上预计得分:100+100+100+100+100+100=600(省一分数线490) (AK是不可能AK的,这辈子不可能AK的) 题解: D1T1 生活大爆炸版石头剪刀布 ...

  2. 【题解】 2月19日 厦门双十中学NOIP2014模拟D2 T1 采药人的切题规则

    Made by 退役的OIer 第一次写博客,写得不好 or 不清楚的可以 在下方留言,我会尽量改进的! 好啦~~~回到正题,题面见传送门 [问题描述] 采药人最近在认真切题,但回旋的转盘时常在眼前浮 ...

  3. [NOIP2014]寻找道路 题解

    题目大意: 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足 ...

  4. [NOIP2014]联合权值 题解

    题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...

  5. noip2014提高组day2二题题解-rLq

    (又是昨天的作业……本题写于昨天) (这破题都做这么久,我是不是吃枣药丸……) (好吧这是一道图论题呢) 本题地址:http://www.luogu.org/problem/show?pid=2296 ...

  6. 【NOIP2014】DAY2题解+代码

    T1 傻逼题……不想写贴昨年代码了. 总之随便怎么搞都能过. 15年的DAY2T1怎么那么毒瘤真是越活越倒退] #include <iostream> #include <fstre ...

  7. 【NOIP2014】Day1题解+代码

    Day1 T1 签到题,模拟一下随便写就能过. 不过小心像我一样表打错傻逼的调了10min. #include <algorithm> #include <iostream> ...

  8. NOIP2014提高组 题解报告

    D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...

  9. 题解 【NOIP2014】解方程

    题面 解析 这题的数据看起来似乎特别吓人... 但实际上, 这题非常好想. 只需要模一个大质数就行了(我模的是1e9+7)(实测有效) 另外,a要用快读读入,再一边模Mod(因为实在太大了). 然后, ...

随机推荐

  1. 读取Excel的记录并导入SQL数据库

    准备一下,近段时间,需要把Excel的数据导入数据库中. 引用命名空间: using System.Configuration; using System.Data; using System.Dat ...

  2. Java HTML to PDF 支持SVG

    尝试一 (现用框架的基础上改动,影响最小化) 最早使用的框架 Xhtmlrenderer,需要把HTML转换成XHTML,引入第二个框架Tidy,Tidy与2010年停止更新,github上的项目也停 ...

  3. VS2015 搭建 Asp.net core 开发环境

    1.首先你得装个vs2015 并且保证已经升级至 update3及以上(此处附上一个vs2015带up3的下载链接: ed2k://|file|cn_visual_studio_enterprise_ ...

  4. R实战 第十一篇:处理缺失值

    在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...

  5. Git push 时如何避免出现 "Merge branch 'master' of ..."

    在使用 Git 的进行代码版本控制的时候,往往会发现在 log 中出现 "Merge branch 'master' of ..." 这句话,如下图所示.日志中记录的一般为开发过程 ...

  6. Wechat login authorization(OAuth2.0)

    一.前言 昨天小组开了个会,让我今天实现一个微信网页授权的功能,可以让用户在授权之后无需再次登录既可进入用户授权界面.在这之前我也从没接触过微信公众号开发之类的,也不知道公众号后台是啥样子的,自己所在 ...

  7. Nagios监控系统部署(源码)

    1. 概述2. 部署Nagios2.1 创建Nagios用户组2.2 下载Nagios和Nagios-plugin源码2.3 编译安装3. 部署Nagios-plugin3.1 编译安装nagios- ...

  8. C#_委托与事件

    委托: 把方法当作参数进行传递 public delegate void AddDelegate(string name); public class Ad{ //addDelegate就是委托的一个 ...

  9. Linux下FTP环境部署梳理(vsftpd和proftpd)

    在日常运维工作中,常部署到的FTP是vsftpd和proftd.之前写了Linux下FTP虚拟账号环境部署总结,下面简单说下本地用户下的FTP环境部署过程: 简单梳理下FTP主动和被动两种工作模式: ...

  10. Proxy基础---------获取collection接口的构造跟方法

    1----查看proxy api 2------测试代码 package cn.proxy01; import java.lang.reflect.Constructor; import java.l ...