noip2014 提高组
T1 生活大爆炸版 石头剪刀布 题目传送门
就是道模拟题咯
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int a,b,n;
int x[],y[],g[],f[];
int w[][]={{,,,,},{,,,,},{,,,,},{,,,,},{,,,,}};
int main()
{
n=read();
int la=read(),lb=read();
for(int i=;i<la;i++) x[i]=read();
for(int i=;i<lb;i++) y[i]=read();
for(int i=;i<n;i++) g[i]=x[i%la],f[i]=y[i%lb];
for(int i=;i<n;i++){
if(w[g[i]][f[i]]==) b++;
if(w[g[i]][f[i]]==) a++;
}
printf("%d %d\n",a,b);
return ;
}
T2 联合权值 题目传送门
易证明和某一个点相连接的点 他们之间的距离就是2 所以我们可以枚举每一个点求值 当然一个一个点去求值太慢
这个时候我们发现了一个神奇的东西 他叫做——加法结合律! 问题就完美解决了.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=,mod=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,first[M],cnt,ans,mx,w[M];
struct node{int to,next;}e[M];
void ins(int a,int b){cnt++; e[cnt].to=b; e[cnt].next=first[a]; first[a]=cnt;}
void insert(int a,int b){ins(a,b); ins(b,a);}
void dfs(int x){
int mx1=,mx2=,sum=;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
sum=(sum+w[now])%mod;
if(w[now]>mx1) mx2=mx1,mx1=w[now];
else if(w[now]>mx2) mx2=w[now];
}
mx=max(mx,mx1*mx2);
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
ans=(ans+w[now]*((sum-w[now])%mod+mod)%mod)%mod;
}
}
int main()
{
int x,y;
n=read();
for(int i=;i<n;i++) x=read(),y=read(),insert(x,y);
for(int i=;i<=n;i++) w[i]=read();
for(int i=;i<=n;i++) dfs(i);
printf("%d %d\n",mx,ans);
return ;
}
T3 飞扬的小鸟 题目传送门
这就是道dp然而看了眼题解自己YY了半天才Ac......主要还是细节处理的问题吧?码力太差
首先很容易想到o(nm*m)的算法 直接推出答案 但是明显会超时 很容易得到f[i][j]=min{f[i-1][j-k*x]+k}
那较小的点会被计算很多次 我们可以由每个点的下面f【i】【j-x】的点推出答案 仍为最优解 这样就可以得出新的方程f[i][j]=min{f[i-1][j-x],f[i][j-x]}
复杂度降下来了就可以写了 当然还可以由上方下降得到 所以我们可以分两次递推得出答案 还有游戏到高度为M的时候不会结束 所以还得特殊考虑
最后 这个游戏不是codevs那里的东东嘛?
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxN=,maxM=,inf=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int f[maxN][maxM];
int n,m,k,x[maxN],y[maxN];
int down[maxN],up[maxN];
int main()
{
n=read(); m=read(); k=read();
for(int i=;i<=n;i++) down[i]=,up[i]=m+;
for(int i=;i<n;i++) x[i]=read(),y[i]=read();
for(int i=;i<=k;i++){
int p=read();
down[p]=read(); up[p]=read();
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
f[i][j]=inf;
f[][]=inf;//for(int i=1;i<=n;i++,printf("\n")) for(int j=1;j<=m;j++) printf("[%d] ",f[i][j]);
//for(int i=1;i<=n;i++) printf("[%d %d]\n",down[i],up[i]);
//for(int i=0;i<n;i++) printf("[%d %d]\n",x[i],y[i]);
for(int i=;i<=n;i++){
for(int j=x[i-];j<=m;j++) f[i][j]=min(f[i-][j-x[i-]]+,f[i][j-x[i-]]+);
for(int j=m-x[i-];j<=m;j++) f[i][m]=min(f[i][m],f[i][j]+),f[i][m]=min(f[i][m],f[i-][j]+);
for(int j=down[i]+;j<=up[i]-;j++) if(j+y[i-]<=m) f[i][j]=min(f[i][j],f[i-][j+y[i-]]);
for(int j=;j<=down[i];j++) f[i][j]=inf;;
for(int j=up[i];j<=m;j++) f[i][j]=inf;
}
int ans=inf,cnt=k;
for(int i=n;i;i--){
for(int j=down[i]+;j<=up[i]-;j++) ans=min(ans,f[i][j]);
if(ans<inf) break;
if(up[i]!=m+) cnt--;
}
if(cnt==k) printf("1\n%d",ans);
else printf("0\n%d",cnt);
return ;
}
T4 无线网络发射器选址 题目传送门
枚举 计算 比较大小 没什么好说的吧
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int d,n,ans,sum;
int map[][];
int main()
{
int x,y,k;
d=read(); n=read();
for(int i=;i<=n;i++) x=read(),y=read(),k=read(),map[x][y]=k;
for(int i=;i<=;i++)
for(int j=;j<=;j++){
int now=;
for(int x=max(,i-d);x<=min(i+d,);x++)
for(int y=max(,j-d);y<=min(j+d,);y++)
now+=map[x][y];
if(ans<now) ans=now,sum=;
if(ans==now) sum++;
}
printf("%d %d\n",sum,ans);
return ;
}
T5 寻找道路 题目传送门
首先可以顺着终点反向bfs一波 记录那些点是可以到达终点的
然后枚举每一个点看他的出边所指向的点是否能到达终点就好了
然后顺着可以走的点走一波spfa就解决问题了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=,maxN=,inf=0x3f3f3f3f;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int first[M],book[M];
int d[M],h[M],cnt,S,T;
int n,m,q[M],use[M];
struct node{int to,next;}e[maxN];
void insert(int a,int b){cnt++; e[cnt].to=b; e[cnt].next=first[a]; first[a]=cnt;}
int sum,last[M];
struct note{int to,next;}e1[maxN];
void ins(int a,int b){sum++; e1[sum].to=b; e1[sum].next=last[a]; last[a]=sum;}
void bfs(){
int head=,tail=;
h[T]=;
while(head!=tail){
int x=q[head++];
for(int i=last[x];i;i=e1[i].next){
int now=e1[i].to;
if(!h[now]){h[now]=; q[tail++]=now;}
}
}
//for(int i=1;i<=n;i++) printf("[%d] ",h[i]); printf("\n");
use[T]=use[S]=;
// for(int x=1;x<=n;x++,printf("\n"))
// for(int i=first[x];i;i=e[i].next) printf("[%d] ",e[i].to);
for(int x=;x<=n;x++){
int now=;
for(int i=first[x];i;i=e[i].next){
now=e[i].to;
if(!h[now]) break;
}
if(!h[now]) continue;
use[x]=;
}
//for(int i=1;i<=n;i++) printf("[%d] ",use[i]); printf("\n");
}
void spfa(){
memset(d,0x3f,sizeof(d));
int head=,tail=;
d[S]=; q[head]=S; book[S]=;
while(head!=tail){
int x=q[head++]; book[x]=; if(head>M) head=;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to; if(!use[now]) continue;
//printf("[%d]\n",now);
if(d[now]>d[x]+){
d[now]=d[x]+;
if(!book[now]){q[tail++]=now; book[now]=; if(tail>M) tail=;}
}
}
}
}
int main()
{
int x,y;
n=read(); m=read();
for(int i=;i<=m;i++){
x=read(); y=read();
if(x!=y) insert(x,y),ins(y,x);
}
S=read(); T=read();
q[]=T; bfs();
spfa();
if(d[T]<inf) printf("%d\n",d[T]);
else printf("-1\n");
return ;
}
T6 解方程题目传送门
这道题确实难 我是照着黄学长的思路来的 神犇传送门
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int mod[]={,,,,};
int n,m,len,sum;
int ans[];
int a[][],pre[][],res[][];
char s[];
int calc(int k){
int sum=;
for(int i=;i<=n;i++) sum=(sum+a[k][i]*pre[k][i])%mod[k];
if(sum<) sum+=mod[k];
return sum;
}
int pd(int x){
for(int k=;k<;k++)
if(res[k][x%mod[k]]) return ;
return ;
}
int main()
{
n=read(); m=read();
for(int i=;i<=n;i++){
scanf("%s",s+); len=strlen(s+);
bool f=;
for(int k=;k<;k++){
if(s[]=='-') f=,a[k][i]=;
else a[k][i]=s[]-'';
}
for(int k=;k<;k++){
for(int j=;j<=len;j++) a[k][i]=(a[k][i]*+s[j]-'')%mod[k];
if(f) a[k][i]=-a[k][i];
}
}
for(int k=;k<;k++){
for(int x=;x<mod[k];x++){
pre[k][]=;
for(int i=;i<=n;i++) pre[k][i]=(pre[k][i-]*x)%mod[k];
res[k][x]=calc(k);
}
}
for(int i=;i<=m;i++) if(pd(i)) ans[++sum]=i;
printf("%d\n",sum);
for(int i=;i<=sum;i++) printf("%d\n",ans[i]);
return ;
}
noip2014 提高组的更多相关文章
- [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
- 刷题总结——飞扬的小鸟(NOIP2014提高组)
题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...
- 垃圾陷阱 && [NOIP2014 提高组] 飞扬的小鸟
#include<bits/stdc++.h> using namespace std; int d,n,dp[1010]; struct node{int t,f,h;} a[1010] ...
- NOIP2014提高组 酱油记
NOIP考到哪里我就写到哪里好了. 2014/10/12 初赛 下午两点半开始考,我两点就到了.然后看到了QYL,NYZ,CZR等大神,先Orz了再说. 考试开始前,发现考场竟然没几个我认识的,不是按 ...
- 【学术篇】luogu1351 [NOIP2014提高组] 联合权值
一道提高组的题..... 传送门:题目在这里.... 现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _ 好久没做题了,手都生了.(好吧其实是做题方面手太生了) 这题我都不想讲了,把代码一 ...
- NOIp2014提高组初赛错题简析
总体分析 \(89pts\),粗略来看选择题错的比较多,\(-6pts\).同时又是尿性的填空杀扣了\(5pts\). 不过后面的两大题全对了还是可喜可贺 错题精析 单项选择T8 编译器的主要功能是( ...
- NOIP2014提高组解方程
其实没有太难 但是不知道的话想不到 考场上大概有50分吧 #include <iostream> #include <stdio.h> #include <queue&g ...
- [NOIP2014] 提高组 洛谷P2312 解方程
题目描述 已知多项式方程: a0+a1x+a2x^2+..+anx^n=0 求这个方程在[1, m ] 内的整数解(n 和m 均为正整数) 输入输出格式 输入格式: 输入文件名为equation .i ...
- [NOIP2014] 提高组 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟
题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...
随机推荐
- hibernate 各历史版本下载 spring各历史版本下载
hibernate 各历史版本下载http://sourceforge.net/projects/hibernate/files/ spring各历史版本下载http://www.springsour ...
- 【IIS】 常见问题
[IIS] 常见问题 1. IIS 安装 .Net FrameWork 4.0 开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行->%windi ...
- Promise关键知识
异步是ES6中使用频率最高的特性之一,也是面试中经常会被问到的问题,特此整理了相应的笔记 一.Promise的三种状态 pending-异步操作没有结束 fulfilled-异步操作已成功结束,最常见 ...
- IDEA的terminal设置成Linux的终端一样
方式一:通过在Windows上安装Linux命令行工具 前提:需要安装Linux终端的命令行工具,并且最好可以安装 Gow (一个Windows下模拟Linux命令行工具集合,它集成了 Liunx 环 ...
- ADB常用指令
adb 命令是adb程序自带的一些命令:adb shell则是调用Android系统的命令,Android系统特有的命令都放在Android设备的/system/bin目录中 MonkeyRunner ...
- URAL 1936 Roshambo(求期望)
Description Bootstrap: Wondering how it's played? Will: It's a game of deception. But your bet inclu ...
- Uva 1590 IP Networks
这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础. 这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼.近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写 ...
- MySQL初始4--去重
更新表中的字段: update 表名 set 字段=新值,… where 条件: UPDATE语法可以用新值更新原有表行中的各列.SET子句指示要修改哪些列和要给予哪些值.WHERE子句指定应更新哪些 ...
- 剑指offer:从头到尾打印链表
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:从头到尾打印链表 题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 首先题目实际给出的要求是返回ve ...
- 图书 Framework 设计指南: 可重用 .NET 库的约定、惯用法和模式 引出资料
文章:框架设计准则 --微软 地址:https://docs.microsoft.com/zh-cn/dotnet/standard/design-guidelines/index