NOIP 2011 Day 1
NOIP 2011 Day 1
tags:
- NOIP
- 搜索
categories: - 信息学竞赛
- 总结
铺地毯
Solution
因为只会询问一个点被谁覆盖, 而且后面的地毯会覆盖前面的地毯, 所以只需要从后往前枚举地毯, 只要能覆盖这个点就是最终覆盖它的地毯.
Code
#include<iostream>
#include<cstdio>
using namespace std;
int x[10005];
int y[10005];
int a[10005];
int b[10005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i)
cin>>x[i]>>y[i]>>a[i]>>b[i];
int p,q;
cin>>p>>q;
for(int i=n;i;--i)
if(p>=x[i]&&q>=y[i])
if(x[i]+a[i]>=p&&y[i]+b[i]>=q){
cout<<i;
return 0;
}
cout<<-1;
return 0;
}
选择客栈
Solution
选择链表, 依次从后枚举每种色调的旅馆, 因为链表本来就是从后往前遍历的, 然后枚举色调相同的前一个宾馆, 如果满足要求, 那么它前面的所有宾馆都满足要求.如果快速判断只要求出一个点其靠后的花费满足要求的最前一个点即可.这个可以通过递推得到.
而且这个链表的复杂度实际上比较玄学的, 理论最高复杂度为\(O(n^2)\), 但是一般不会达到.而且他实际上比最优解只慢几倍.并不知道最优解释什么……
Code
#include<iostream>
#include<cstdio>
#define N 200005
#define inf 0x3f3f3f3f
using namespace std;
struct Edge{
int v,nxt;
}e[N];
int head[N],tot;
int n,k,p;
int c[N];
int f[N];
int count[N];
int kth[N];
void AddEdge(int pos,int u){
e[++tot]=(Edge){pos,head[u]};head[u]=tot;
}
int a,b;
int main(){
cin>>n>>k>>p;
for(int i=1;i<=n;++i){
scanf("%d%d",&b,&a);c[i]=a;
AddEdge(i,b);
}
for(int i=0;i<k;++i){
int sum=0;
for(int j=head[i];j;j=e[j].nxt)
kth[e[j].v]=sum,++sum;
count[i]=sum;
}
f[n]=inf;
long long ans=0;
if(c[n]<=p)f[n]=n;
for(int i=n-1;i>=1;--i){
if(c[i]<=p)f[i]=i;
else f[i]=f[i+1];
}
int p2,p3;
for(int i=k-1;i>-1;--i){
p2=head[i];
for(;p2;p2=e[p2].nxt){
for(p3=e[p2].nxt;p3;p3=e[p3].nxt){
if(e[p2].v>e[p3].v&&f[e[p3].v]<=e[p2].v){
ans+=count[i]-kth[e[p3].v];
break;
}
}
}
}
printf("%lld",ans);
return 0;
}
Mayan游戏
Solution
这应该是这三个题中最容易看出做法的题, 但是并不是很好写.写到100行到200行之间还是比较正常的.
看见一个写的比较漂亮的(封装的比较好).并非一日之功, 改天练好本领再来挑战你吧!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<stack>
using namespace std;
struct board{
int p[5][7];
inline void read();
inline void down(int line){
for(int i(1);i<7;++i){
if(!p[line][i])continue;
int pos(i);
while(!p[line][pos-1]&&pos>0){
p[line][pos-1]=p[line][pos];
p[line][pos]=0;
--pos;
}
}
}
inline bool empty(){
for(int i(0);i<5;++i)if(p[i][0])return false;
return true;
}
inline void swap(int x1,int y1,int x2,int y2){
if(p[x1][y1]==p[x2][y2])return;
p[x1][y1]^=p[x2][y2];
p[x2][y2]^=p[x1][y1];
p[x1][y1]^=p[x2][y2];
if(!p[x1][y1]||!p[x2][y2])
down(x1),down(x2);
}
inline bool clear(){
bool cls[5][7];
bool k(false);
for(int i(0);i<5;++i)
for(int j(0);j<7;++j)
cls[i][j] = false;
for(int i(0);i<5;++i){
int now(0);
for(int j(1);j<7;++j){
if(!p[i][j])break;
if(p[i][j]!=p[i][now]){now=j;continue;}
if(j-now==2){k=true;for(int k(now);k<=j;++k)cls[i][k]=true;}
if(j-now>2)cls[i][j]=true;
}
}
for(int i(0);i<7;++i){
int now(0);
for(int j(1);j<5;++j){
if(p[j][i]==0){now=j+1;continue;}
if(p[j][i]!=p[now][i]){now=j;continue;}
if(j-now==2){k=true;for(int k(now);k<=j;++k)cls[k][i]=true;}
if(j-now>2)cls[j][i]=true;
}
}
if(!k)return false;
for(int i(0);i<5;++i){
bool e(false);
for(int j(0);j<7;++j)
if(cls[i][j])
e=true,p[i][j] = 0;
if(e)down(i);
}
return true;
}
bool operator<(const board &a)const{
for(int i(0);i<5;++i)
for(int j(0);j<7;++j)
if(p[i][j]!=a.p[i][j])
return p[i][j]<a.p[i][j];
return false;
}
};
void board::read(){
memset(p,0,sizeof(p));
for(int i(0);i<5;++i){
for(int j(0);j<7;++j){
scanf("%d",&p[i][j]);
if(!p[i][j])break;
if(j==6)scanf("%*d");
}
}
}
stack<pair<pair<int,int>,int> > ans;
map <board,bool> used[10];
int n;
inline bool dfs(int step,board now){
if(n<step)return now.empty();
if(used[step][now])return false;
used[step][now]=1;
int tot[11];
memset(tot,0,sizeof(tot));
for(int i(0);i<5;++i)for(int j(0);j<7;++j)++tot[now.p[i][j]];
int i(0),j;
board tmp;
for(j=0;j<7;++j){
if(!now.p[0][j])break;
tmp=now;
tmp.swap(0,j,1,j);
while(tmp.clear());
if(dfs(step+1,tmp)){
ans.push(make_pair(make_pair(0,j),1));
return true;
}
}
for(int i(1);i<4;++i){
for(int j(0);j<7;++j){
if(!now.p[i][j])break;
tmp=now;
tmp.swap(i,j,i+1,j);
while(tmp.clear());
if(dfs(step+1,tmp)){
ans.push(make_pair(make_pair(i,j),1));
return true;
}
if(!now.p[i-1][j]){
tmp=now;
tmp.swap(i,j,i-1,j);
while(tmp.clear());
if(dfs(step+1,tmp)){
ans.push(make_pair(make_pair(i,j),-1));
return true;
}
}
}
}
for(int j(0);j<7;++j){
if(!now.p[4][j])break;
if(!now.p[3][j]){
tmp=now;
tmp.swap(4,j,3,j);
while(tmp.clear());
if(dfs(step+1,tmp)){
ans.push(make_pair(make_pair(4,j),-1));
return true;
}
}
}
return false;
}
int main(){
scanf("%d",&n);
board start;
start.read();
if(dfs(1,start)){
while(!ans.empty()){
pair<pair<int,int>,int> tmp;
tmp=ans.top();
printf("%d %d %d\n",tmp.first.first,tmp.first.second,tmp.second);
ans.pop();
}
}
else printf("-1\n");
return 0;
}
NOIP 2011 Day 1的更多相关文章
- Noip 2011 Day 1 & Day 2
Day 1 >>> T1 >> 水题一道 . 我们只需要 for 一遍 , 由于地毯是从下往上铺的 , 我们只需要记录该位置最上面的地毯的编号 , 每一次在当前地 ...
- 【NOIP 2011】 观光公交
题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号 ...
- NOIP 2011 Day2
tags: 贪心 模拟 NOIP categories: 信息学竞赛 总结 计算系数 Solution 根据二项式定理, \[ \begin{align} (a+b)^n=\sum_{k=0}^nC_ ...
- NOIp 2011 mayan游戏 搜索
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...
- NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)
Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...
- NOIP 2011 提高组 计算系数
有二项式定理 `\left( a+b\right) ^{n}=\sum _{r=0}^{n}\left( \begin{matrix} n\\ r\end{matrix} \right) a^{n-r ...
- [NOIP 2011]聪明的质监员
聪明的质监员 题目 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1. 给定 m个区间[ ...
- [NOIp 2011]Mayan游戏
Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏 ...
- NOIP 2011 观光公交
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
随机推荐
- JUC包中的分而治之策略-为提高性能而生
一.前言 本次分享我们来共同探讨JUC包中一些有意思的类,包含AtomicLong & LongAdder,ThreadLocalRandom原理. 二.AtomicLong & Lo ...
- Android 内核--Binder架构分析
一.Binder架构 在Android中,Binder用于完成进程间通信(IPC),即把多个进程关联在一起.比如,普通应用程序可以调用音乐播放服务提供的播放.暂停.停止等功能.Binder工作在Lin ...
- BZOJ5300:[CQOI2018]九连环——题解
一种打表的方法,适用于知道如何解九连环的人. 我们知道,解九(n)连环必须先解第九(n)环,然后解八(n-1).七(n-2)-- 根据这个我们飞快的写出了一个递推式,设\(f[i]\)为\(i\)连环 ...
- BZOJ1068:[SCOI2007]压缩——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复 ...
- 模板:数论 & 数论函数 & 莫比乌斯反演
作为神秘奖励--?也是为了方便背. 所有的除法都是向下取整. 数论函数: \((f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\) \((Id*\mu)(n)=\sum_{d ...
- C++重载运算简介
本文基于<C++ Primer(第5版)>中14章和<More Effective C++>条款7,整理而成. 其实写这篇博客之前,内心还是很忐忑的,因为,博主的水平很有限,视 ...
- 《Java程序设计》第五周学习总结 20165218 2017-2018-2
<Java程序设计>第五周学习总结 20165218 2017-2018-2 教材学习内容总结 第7章 内部类与异常类 内部类 在类中定义另一个类,外嵌类和内部类 内部类可以用外嵌类中的成 ...
- HDOJ.1009 FatMouse' Trade (贪心)
FatMouse' Trade 点我挑战题目 题意分析 每组数据,给出有的猫粮m与房间数n,接着有n行,分别是这个房间存放的食物和所需要的猫粮.求这组数据能保证的最大的食物是多少? (可以不完全保证这 ...
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- ContextLoaderListener和Spring MVC中的DispatcherServlet加载内容的区别【转】
原文地址:https://blog.csdn.net/py_xin/article/details/52052627 ContextLoaderListener和DispatcherServlet都会 ...