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. 常见 HTTP/FTP/WebSocket 错误代码大全 - 转

    HTTP 1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除 ...

  2. POJ1845

    这还是一道综合了许多数论的知识点的,做完也涨了不少姿势 但还是因为约数和公式这个鬼东西去找了度娘 题意很简单,就是求\(A^B\)的约数之和\(mod\ 9901\). 但是这种题意越是简单的题目越是 ...

  3. .NetCore实践篇:分布式监控Zipkin持久化之殇

    前言 本系列已写了四篇文章,读本篇之前,可以先读前面几篇. 思考大纲:.Net架构篇:思考如何设计一款实用的分布式监控系统? 实践篇一:.NetCore实践篇:分布式监控客户端ZipkinTracer ...

  4. kvm虚拟机日常操作命令梳理

    KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理.废话不多说,下面列出kvm日常管理中的命令 1)查看KVM虚拟机配置文件及运行状态 KVM虚拟机默认配置文件位置: /etc/libvirt ...

  5. 【2016.3.16】作业 VS2015安装&单元测试(1)

    首先说下本机配置. CPU:Intel Atom x5-z8300 @1.44GHz 内存:2GB 操作系统:Windows10 家庭版 32位 硬盘:32GB 然后开始怒装visual studio ...

  6. SSH框架开发蛋糕房管理系统之质量属性

    SSH框架开发蛋糕房管理系统之质量属性 我要开发的系统是基于ssh框架的蛋糕房管理系统.本系统前台提供的主要功能是在线预定蛋糕,本店管理员拥有最高权限,包括收银管理,设备管理,日常销售管理,蛋糕定制管 ...

  7. Leetcode——58.最后一个单词的长度

    给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...

  8. 第二个spring,第一天

    陈志棚:成绩的统筹 李天麟:界面音乐 徐侃:代码算法 由于队友们都回家了,只有我在努力的写代码...

  9. PAT 1039 到底买不买

    https://pintia.cn/problem-sets/994805260223102976/problems/994805283241443328 小红想买些珠子做一串自己喜欢的珠串.卖珠子的 ...

  10. PAT 1031 查验身份证

    https://pintia.cn/problem-sets/994805260223102976/problems/994805290334011392 一个合法的身份证号码由17位地区.日期编号和 ...