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 ...
随机推荐
- BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...
- BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...
- C++重载运算简介
本文基于<C++ Primer(第5版)>中14章和<More Effective C++>条款7,整理而成. 其实写这篇博客之前,内心还是很忐忑的,因为,博主的水平很有限,视 ...
- bzoj1878: [SDOI2009]HH的项链(主席树/离线+BIT)
这题有离线和在线两种做法. 离线:将查询区间按左端点排序,预处理出所有数下一次的出现位置,一开始将所有第一次出现的数a[i]++,之后当扫到这个数的时候a[next[i]]++,相当于差分,给之后 ...
- 【链表】【UVA11988】Broken Keyboard
传送门 明明是道黄题我竟然来写博客……我真的是什么数据结构也不会写了 Description 你在输入文章的时候,键盘上的Home键和End键出了问题,会不定时的按下.你却不知道此问题,而是专心致志地 ...
- HDU1530 最大团 模板
Maximum Clique Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Sublime Text 配置python文件
每次配置Sublime Text的都是好一顿搜索配置信息,今天特地把自己电脑上配置好的信息保存下来,方便以后使用. 用到了 AutoPEP8.Anaconda.SublimeCodeIntel.Sub ...
- 如何根据域名来得到对应的IP
如何根据域名来得到对应的IP呢? windows下打开cmd窗口,然后ping.如下图: 这样就可以看到IP了. 如何查看自己电脑对应的IP? 当通过代理上网时,可能无法通过网络连接信息查看自己电脑的 ...
- sscanf的用法
sscanf也太好用了8我竟然一直都不知道qaq #include<cstdio> #include<cstdlib> #include<cstring> #inc ...
- JS之document例题讲解2
例题三.图片轮播 <body> <div style="width:1000px; height:250px; margin-top:30px"> < ...