NOIP 2015
- Prob.1 2015 神奇的幻方
模拟就好了。
(这不是noip2017的初赛题么。)代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[55][55];
int n,x,y,cnt;
int main(){
scanf("%d",&n);
x=1; y=n/2+1;
while(cnt<n*n){
a[x][y]=++cnt;
if((x==1&&y==n)||a[x-1][y+1]) x++;
else{
if(x==1) x=n,y++;
else if(y==n) x--,y=1;
else x--,y++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<n;j++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][n]);
}
return 0;
}
- Prob.2 2015 信息传递
(这个题真是有毒)
先把入度为0的点依次去掉,bfs实现,
最后图中剩下一个简单环或者多个简单环。
然后对这些环跑dfs,求出最小的那个环长
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 200005
using namespace std;
int dis[MAXN],to[MAXN],in[MAXN],vis[MAXN];
int n,st,ans=0x3f3f3f3f;
queue<int>q;
void dfs(int u,int fa){
dis[u]=dis[fa]+1; vis[u]=1;
if(vis[to[u]]) ans=min(ans,dis[u]-dis[to[u]]+1);
else dfs(to[u],u);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&to[i]),in[to[i]]++;
for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
while(!q.empty()){
int u=q.front(); q.pop(); vis[u]=1;
in[to[u]]--; if(!in[to[u]]) q.push(to[u]);
}
for(int i=1;i<=n;i++) if(!vis[i]){
dfs(i,0);
}
printf("%d",ans);
return 0;
}
- Prob.3 2015 斗地主
(令人畏惧的题目)
思路:
dfs用来出顺子牌,
然后剩下的牌按照贪心策略去出,使得出牌次数尽量少。
吐槽:这个搜索还真是暴力。贪心也很666。
然后具体看代码实现。
(但是Vijos上的第95组怎么过不了???试了几个网上的代码,似乎也不行。)
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 25
using namespace std;
int a[MAXN];
int T,n,ans;
int get(){//贪心打出非顺子牌
static int cnt,c[MAXN];
memset(c,0,sizeof(c)); cnt=0;
for(int i=0;i<=13;i++) c[a[i]]++;
while(c[4]&&c[2]>1) cnt++,c[4]--,c[2]-=2;
while(c[4]&&c[1]>1) cnt++,c[4]--,c[1]-=2;
while(c[4]&&c[2]) cnt++,c[4]--,c[2]--;
while(c[3]&&c[2]) cnt++,c[3]--,c[2]--;
while(c[3]&&c[1]) cnt++,c[3]--,c[1]--;
cnt+=c[1]+c[2]+c[3]+c[4];
return cnt;
}
void dfs(int now){//dfs顺子牌
if(now>=ans) return;
int tmp=get();
ans=min(now+tmp,ans);
for(int i=2,j;i<=13;i++){//三顺子
j=i;
while(a[j]>=3) j++;
if(j-i>=2){
for(int p=i+1;p<j;p++){
for(int k=i;k<=p;k++) a[k]-=3;
dfs(now+1);
for(int k=i;k<=p;k++) a[k]+=3;
} }
}
for(int i=2,j;i<=13;i++){//二顺子
j=i;
while(a[j]>=2) j++;
if(j-i>=3){
for(int p=i+2;p<j;p++){
for(int k=i;k<=p;k++) a[k]-=2;
dfs(now+1);
for(int k=i;k<=p;k++) a[k]+=2;
}
}
}
for(int i=2,j;i<=13;i++){//单顺子
j=i;
while(a[j]>=1) j++;
if(j-i>=5){
for(int p=i+4;p<j;p++){
for(int k=i;k<=p;k++) a[k]-=1;
dfs(now+1);
for(int k=i;k<=p;k++) a[k]+=1;
}
}
}
}
int main(){
scanf("%d%d",&T,&n);
while(T--){
memset(a,0,sizeof(a)); ans=0x3f3f3f3f;
for(int i=1,x,y;i<=n;i++){
scanf("%d%d",&x,&y);
if(x==1) x=13;
else if(x!=0)x--;
a[x]++;
}
dfs(0);
printf("%d\n",ans);
}
return 0;
}
- Prob.4 2015 跳石头
二分
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[50005];
int n,m,len;
bool check(int lim){
int p=0,cnt=0;
for(int i=1;i<=n+1;i++){
if(a[i]-a[p]>=lim) p=i;
else{
cnt++;
if(i==n+1&&p==0) return 0;
if(cnt>m) return 0;
}
}
return 1;
}
int binary(int l,int r){
int mid,ans=-1;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
int main(){
scanf("%d%d%d",&len,&n,&m); a[n+1]=len;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int ans=binary(0,len);
printf("%d",ans);
return 0;
}
- Prob.5 2015 子串
dp[i][j][k][0/1]: 匹配到A串的i位置,B串的j位置,且已经选了k段,i位置选不选 的方案数
转移就看代码吧,很明显的。
(怎么我的方法和网上的都不太一样???原来车车和我一样,==似乎本质和网上也差不多。呃,我在干嘛?)
#include<cstdio>
#include<cstring>
#include<iostream>
#define rint register int
using namespace std;
const int mod=1000000007;
char A[1005],B[205];
int dp[2][205][205][2];
int n,m,o,ans,x=1,y=0;
void add(int &a,int b){
a=(1ll*a+b)%mod;
}
int main(){
scanf("%d%d%d",&n,&m,&o);
scanf("%s%s",A+1,B+1);
dp[0][0][0][0]=1;
for(rint i=0;i<=n;i++){
swap(x,y);
memset(dp[y],0,sizeof(dp[y]));
for(rint j=0;j<=min(i,m);j++)
for(rint k=0;k<=min(j,o);k++){
add(dp[y][j][k][0],dp[x][j][k][0]);
add(dp[y][j][k][0],dp[x][j][k][1]); if(A[i+1]==B[j+1]) add(dp[y][j+1][k+1][1],dp[x][j][k][0]),
add(dp[y][j+1][k+1][1],dp[x][j][k][1]),
add(dp[y][j+1][k][1],dp[x][j][k][1]);
}
}
add(ans,dp[y][m][o][0]),add(ans,dp[y][m][o][1]);
printf("%d",ans);
return 0;
}
- Prob.6 2015 运输计划
好题,二分答案。
统计一个cnt,表示有多少个计划不能在时限内完成。
同时记下最大的md,表示耗时最长的那个计划与二分的mid的差值。
然后在树上打上差分标记。
跑一遍dfs,对于一条被所以超时的计划经过的边,如果其边权大于等于md,则合法。(要把权值下放到点)
如果不存在这样的边,则不合法。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 300005
#define rint register int
using namespace std;
struct express{
int s,t,lca,len;
}p[MAXN];
struct edge{
int to,val,next;
}e1[MAXN*2],e2[MAXN*2];
int head1[MAXN],head2[MAXN],fa[MAXN],dis[MAXN],c[MAXN];
int n,m,ent1=2,ent2=2,cnt,md;
bool fg;
inline void add(int u,int v,int w,int &ent,int *head,edge *e){
e[ent]=(edge){v,w,head[u]};
head[u]=ent++;
}
inline int find(int u){
return u==fa[u]?u:fa[u]=find(fa[u]);
}
inline void Tarjan(int u,int dad,int val){ //Tarjan求lca
fa[u]=u; dis[u]=dis[dad]+val;
for(rint i=head2[u];i;i=e2[i].next){
int v=e2[i].to,j=e2[i].val;
if(!fa[v]) continue;
p[j].lca=find(v);
p[j].len=dis[u]+dis[v]-2*dis[p[j].lca];
}
for(rint i=head1[u];i;i=e1[i].next){
int v=e1[i].to;
if(v==dad) continue;
Tarjan(v,u,e1[i].val);
}
fa[u]=dad;
}
inline int dfs(int u,int dad,int val){
int tmp=0;
for(rint i=head1[u];i;i=e1[i].next){
int v=e1[i].to;
if(v==dad) continue;
tmp+=dfs(v,u,e1[i].val);
}
tmp+=c[u];
if(tmp==cnt&&val>=md) fg=1;
return tmp;
}
inline bool check(int lim){
cnt=0; md=0;
memset(c,0,sizeof(c));
for(rint i=1;i<=m;i++){
if(p[i].len>lim) {
cnt++;
md=max(md,p[i].len-lim);
c[p[i].s]++; c[p[i].t]++;
c[p[i].lca]-=2;
}
}
fg=0;
dfs(1,0,0);
return fg;
}
inline int binary(int r){//二分答案,(最小时间)
int l=0,mid,ans=0;
while(l<=r){
mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
return ans;
}
int main(){
scanf("%d%d",&n,&m); int r=0;
for(rint i=1,u,v,w;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w,ent1,head1,e1);
add(v,u,w,ent1,head1,e1);
r+=w;
}
for(rint i=1;i<=m;i++){
scanf("%d%d",&p[i].s,&p[i].t);
add(p[i].s,p[i].t,i,ent2,head2,e2);
add(p[i].t,p[i].s,i,ent2,head2,e2);
}
Tarjan(1,0,0);
int ans=binary(r);
printf("%d",ans);
return 0;
}
NOIP 2015的更多相关文章
- 4632 NOIP[2015] 运输计划
4632 NOIP[2015] 运输计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 公元 2044 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- Luogu 2668 NOIP 2015 斗地主(搜索,动态规划)
Luogu 2668 NOIP 2015 斗地主(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来 ...
- [普及]NOIP 2015 推销员 贪心
NOIP 2015 推销员 题意: 有一个喜欢疲劳的推销员,告诉你在一个单口胡同(数轴)中的n户家庭的位置,和向他们推销可以获得的疲劳度.分别输出向(1,2,3,4...n)户人家推销可以得到的最大疲 ...
- cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分
2109. [NOIP 2015] 运输计划 ★★★☆ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:3 s 内存限制:256 MB [题 ...
- 洛谷P2668 斗地主==codevs 4610 斗地主[NOIP 2015 day1 T3]
P2668 斗地主 326通过 2.6K提交 题目提供者洛谷OnlineJudge 标签搜索/枚举NOIp提高组2015 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 出现未知错误是说梗啊 ...
- NOIp 2015真题模拟赛 By cellur925
果然我还是最菜的==不接受反驳== Day1 T1:神奇的幻方 思路:直接模拟即可,由于当前放法只与上一放法有关系,用两个变量记录一下即可.10分钟内切掉== 预计得分:100分 实际得分:100分 ...
- NOIp 2015信息传递【tarjan/拓扑/并查集】
一道好的NOIp题目,在赛场上总能用许多算法A掉.比如这道和关押罪犯. 题目传送门 法一:tarjan在有向图中跑最小环 有人从别人口中得知自己信息,等效于出现了一个环.于是 这就变成了一个有向图ta ...
随机推荐
- 冲刺NO.2
Alpha冲刺第二天 站立式会议 项目进展 团队成员在确定了所需技术之后,开始学习相关技术的使用,其中包括了HTML5,CSS与SSH框架等开发技术.并且在项目分工配合加以总结和完善,对现有发现的关于 ...
- es6对象字面量增强
相对于ES5,ES6的对象字面量得到了很大程度的增强.这些改进我们可以输入更少的代码同时语法更易于理解.那就一起来看看对象增强的功能.对象字面量简写(Object Literal Shorthand) ...
- C++ 实现一个信号量
C++ 实现一个信号量 信号量有很多应用场景,事实上只要是生产者-消费者模型,一般都需要一个信号量来控制. POSIX接口是有PV信号量API的.但C++标准没有.下面是一个PV信号量的简单实现.有些 ...
- 深度学习之 cnn 进行 CIFAR10 分类
深度学习之 cnn 进行 CIFAR10 分类 import torchvision as tv import torchvision.transforms as transforms from to ...
- Win10安装Ubuntu14.04.5双系统(显示器为DP接口)
系统安装主要参考了这篇博文Win10+Ubuntu17.04双系统安装,不再重复. 重点说说DP接口的事,如果主机有VGA接口的话可以到此为止了,如果只有DP接口的话可以参考以下内容. 一.Ubunt ...
- 证明二叉查找树所有节点的平均深度为O(logN)
数据结构与算法分析(c语言描述)第4章 P78 概念一:一棵树所有节点的深度和称为内部路径长 令D(N)为一棵有N节点的树的内部路径长么,即有D(1)=0, 设一棵树的左子树的内部路径长为D(i),则 ...
- maven管理的jsp应用如何添加servlet、jsp相关依赖(org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.index_jsp)
背景: 老大让做权限控制,研究了一下shiro,下了个demo下来,死活跑不起来,报 org.apache.jasper.JasperException: java.lang.ClassNotFoun ...
- Mybatis多个参数传值方法
第一种方案 DAO层的函数方法 Public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...
- [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- SpringBoot2.x开发案例之整合Quartz任务管理系统
基于spring-boot 2.x + quartz 的CRUD任务管理系统,适用于中小项目. 基于spring-boot +quartz 的CRUD任务管理系统: https://gitee.com ...