NOIP 2011 Day 1

tags:

  • NOIP
  • 搜索

    categories:
  • 信息学竞赛
  • 总结

铺地毯

选择客栈

Mayan游戏

铺地毯

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的更多相关文章

  1. Noip 2011 Day 1 & Day 2

    Day 1   >>> T1   >> 水题一道 . 我们只需要 for 一遍 , 由于地毯是从下往上铺的 , 我们只需要记录该位置最上面的地毯的编号 , 每一次在当前地 ...

  2. 【NOIP 2011】 观光公交

    题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号 ...

  3. NOIP 2011 Day2

    tags: 贪心 模拟 NOIP categories: 信息学竞赛 总结 计算系数 Solution 根据二项式定理, \[ \begin{align} (a+b)^n=\sum_{k=0}^nC_ ...

  4. NOIp 2011 mayan游戏 搜索

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  5. NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)

    Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求 ...

  6. NOIP 2011 提高组 计算系数

    有二项式定理 `\left( a+b\right) ^{n}=\sum _{r=0}^{n}\left( \begin{matrix} n\\ r\end{matrix} \right) a^{n-r ...

  7. [NOIP 2011]聪明的质监员

    聪明的质监员 题目 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1. 给定 m个区间[ ...

  8. [NOIp 2011]Mayan游戏

    Description Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏 ...

  9. NOIP 2011 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

随机推荐

  1. POJ3630:Phone List——题解

    http://poj.org/problem?id=3630 简单的trie树问题,先添加,然后每个跑一边看中途有没有被打上结束标记即可. #include<cstdio> #includ ...

  2. BZOJ5338:[TJOI2018]异或——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5338 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操 ...

  3. BZOJ1034 [ZJOI2008]泡泡堂BNB 【贪心】

    1034: [ZJOI2008]泡泡堂BNB Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3531  Solved: 1798 [Submit][ ...

  4. SRM16 B-2(DP)

    老鼠和洞按坐标排序 f[i][j]表示前i个洞进j只老鼠的最短距离 比赛的时候强行分三类去推式子,推是推出来了,也看出来是可以用三个单调队列去优化的,但是太繁琐了,要我敲我真没办法T^T 赛后经 on ...

  5. bzoj4822: [Cqoi2017]老C的任务(扫描线+BIT/线段树)

    裸题... 依旧是写了BIT和线段树两种(才不是写完线段树后才想起来可以写BIT呢 怎么卡常数都挺大...QAQ ccz和yy的写法好快哇%%% BIT: #include<iostream&g ...

  6. 【优先队列】【UVa11997】K Smallest Sums

    传送门 Description Input Output Translation · 给定k个长度为k的数组,把每个数组选一个元素加起来,这样共有kk种可能的答案,求最小的k个 Sample Inpu ...

  7. HDU4009:Transfer water(有向图的最小生成树)

    Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)To ...

  8. 数据分析侠A的成长故事

    数据分析侠A的成长故事 面包君  同学A:22岁,男,大四准备实习,计算机专业,迷茫期 作为一个很普通的即将迈入职场的他来说,看到周边的同学都找了技术开发的岗位,顿觉自己很迷茫,因为自己不是那么喜欢钻 ...

  9. js实现游戏转盘抽奖

    <!DOCTYPE html> <html> <head> <title>js抽奖</title> <meta charset=&qu ...

  10. [Leetcode] LRU 算法实现

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...