NOIP2014题解
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题解的更多相关文章
- [NOIP补坑计划]NOIP2014 题解&做题心得
六道普及组题,没啥好说的 场上预计得分:100+100+100+100+100+100=600(省一分数线490) (AK是不可能AK的,这辈子不可能AK的) 题解: D1T1 生活大爆炸版石头剪刀布 ...
- 【题解】 2月19日 厦门双十中学NOIP2014模拟D2 T1 采药人的切题规则
Made by 退役的OIer 第一次写博客,写得不好 or 不清楚的可以 在下方留言,我会尽量改进的! 好啦~~~回到正题,题面见传送门 [问题描述] 采药人最近在认真切题,但回旋的转盘时常在眼前浮 ...
- [NOIP2014]寻找道路 题解
题目大意: 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足 ...
- [NOIP2014]联合权值 题解
题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...
- noip2014提高组day2二题题解-rLq
(又是昨天的作业……本题写于昨天) (这破题都做这么久,我是不是吃枣药丸……) (好吧这是一道图论题呢) 本题地址:http://www.luogu.org/problem/show?pid=2296 ...
- 【NOIP2014】DAY2题解+代码
T1 傻逼题……不想写贴昨年代码了. 总之随便怎么搞都能过. 15年的DAY2T1怎么那么毒瘤真是越活越倒退] #include <iostream> #include <fstre ...
- 【NOIP2014】Day1题解+代码
Day1 T1 签到题,模拟一下随便写就能过. 不过小心像我一样表打错傻逼的调了10min. #include <algorithm> #include <iostream> ...
- NOIP2014提高组 题解报告
D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...
- 题解 【NOIP2014】解方程
题面 解析 这题的数据看起来似乎特别吓人... 但实际上, 这题非常好想. 只需要模一个大质数就行了(我模的是1e9+7)(实测有效) 另外,a要用快读读入,再一边模Mod(因为实在太大了). 然后, ...
随机推荐
- nginx下目录浏览及其验证功能、版本隐藏等配置记录
工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果;而Nginx的目录列表功能默认是关闭的,如果需要打开Nginx的目录列表功能,需要手动配置, ...
- bootstrap面试题
1.你能描述一下渐进增强和优雅降级之间的不同吗? 优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器,则代码会检查以确认它们是否能正常工作.由于IE独特的盒模型布局问题,针 ...
- Linux内核分析 笔记七 可执行程序的装载 ——by王玥
一.预处理.编译.链接和目标文件的格式 (一)可执行程序是怎么得来的? 1. 2.可执行文件的创建——预处理.编译和链接 shiyanlou:~/ $ cd Code ...
- 读书笔记(chapter17)
设备类型:在所有Unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标码的机制 内核对象:内核数据结构中支持面对对象的简单操作,还支持维护对象之间的父子关系 1 ...
- [Intellij IDEA]_eclipse项目导入
http://www.cnblogs.com/lindp/p/4484390.html
- Tomcat7注册为Linux服务
https://www.openprogrammer.info/2015/06/14/how-to-install-java-8-and-tomcat-8-on-centos-6-as-service ...
- Why yarn
http://www.cnblogs.com/LeftNotEasy/archive/2012/02/18/why-yarn.html https://www.ibm.com/developerwor ...
- js堆栈
//栈只存地址 堆存对象和地址: 浅拷贝: 深拷贝: 队列类似于过道,走廊:
- pycharm5.0 快捷键大全osx
官网链接https://resources.jetbrains.com/assets/products/pycharm/PyCharm_ReferenceCard_mac.pdf 一直想给别人安利py ...
- HTML5 & how to download SVG in js
HTML5 & how to download SVG in js how to download SVG in js http://dinbror.dk/blog/how-to-downlo ...