NOIP 2010 提高组合集

T1 机器翻译

模拟题,用一个栈模拟,桶记录即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define N 1010
using namespace std; map<int,int>mp; int que[N],a[N]; int l,r;
int main()
{
int ans=0;
int m,n; scanf("%d%d",&m,&n); for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(mp[a[i]]) continue;
else
{
ans++;
que[++r]=a[i];
mp[a[i]]=1;
if(r-l+1>m)
{
mp[que[l]]=0;
l++;
}
}
}
printf("%d\n",ans);
return 0;
}

T2 关押罪犯

开始的时候这个题特别容易做成直接模拟,然后记录带敌人集合并查集的最大值之类的错误做法。

这个题我们将所有的关系按照怨气值排序,紧接着我们只要逐一尽量满足即可。第一个不能满足的就是答案。

#include <cstdio>
#include <algorithm>
using namespace std;
struct Node {int x,y,z;}f[100010];
int n,m,a[20005],b[20005],i;
inline bool cmp(const Node &x,const Node &y) {return x.z>y.z;}
int find(int x) {return a[x]==x?x:a[x]=find(a[x]);}
inline void merge(int x,int y) {a[find(x)]=find(y);}
inline bool check(int x,int y) {return find(x)==find(y);}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) a[i]=i;
for(i=1;i<=m;i++)
scanf("%d%d%d",&f[i].x,&f[i].y,&f[i].z);
sort(f+1,f+m+1,cmp);
for(i=1;i<=m+1;i++)
{
if(check(f[i].x,f[i].y)) {printf("%d",f[i].z);break;}
else
{
if(!b[f[i].x]) b[f[i].x]=f[i].y;
else {merge(b[f[i].x],f[i].y);}
if(!b[f[i].y]) b[f[i].y]=f[i].x;
else {merge(b[f[i].y],f[i].x);}
}
}
return 0;
}

T3 乌龟棋

一眼dp的题。关键在于状态,开始的时候我设成了f[all][i][j][k][l],表示一共走了all,每个卡片分别用了i,j,k,l个。然后自信的认为最后一维可以卡掉,然后就不会优化了。

之后开心的开题解,以为对于那个东西可以有什么好的方式优化,结果... ...tm我们可以把第一维压掉...转移显然。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; int num[400];
int f[41][41][41][41]; int g[5];
inline void fix(int &x,int y) {x=max(x,y);}
int main()
{
int n,m,x; cin >> n >> m ;
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
for(int i=1;i<=m;i++) scanf("%d",&x),g[x]++;
f[0][0][0][0]=num[1];
for(int i=0;i<=g[1];i++) for(int j=0;j<=g[2];j++) for(int k=0;k<=g[3];k++) for(int l=0;l<=g[4];l++)
{
int dic=i+2*j+3*k+4*l+1;
if(i) fix(f[i][j][k][l],f[i-1][j][k][l]+num[dic]);
if(j) fix(f[i][j][k][l],f[i][j-1][k][l]+num[dic]);
if(k) fix(f[i][j][k][l],f[i][j][k-1][l]+num[dic]);
if(l) fix(f[i][j][k][l],f[i][j][k][l-1]+num[dic]);
}
printf("%d\n",f[g[1]][g[2]][g[3]][g[4]]);
return 0;
}

T4 引水入城。

联赛中还算友好的爆搜。我们对于每一个接受格子开始bfs,易于发现每个发射格子能匹配的肯定是一条线段,之后dp就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 510
#define nx x+xx[i]
#define ny y+yy[i]
int l[N][N],r[N][N];
int high[N][N];
int n,m;
bool vis[N][N];
int xx[4]={-1,0,1,0};
int yy[4]={0,1,0,-1};
int qx[N*N],qy[N*N];
inline char nc() {static char *p1,*p2,buf[100000]; return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}
int rd() {int x=0; char c=0; while(!isdigit(c)) c=nc(); while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=nc(); return x;}
void dfs(int x,int y)
{
vis[x][y]=true;
for(int i=0;i<4;i++)
{
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(high[nx][ny]>=high[x][y]) continue;
if(!vis[nx][ny])dfs(nx,ny);
l[x][y]=min(l[x][y],l[nx][ny]);
r[x][y]=max(r[x][y],r[nx][ny]);
}
}
int main()
{
n=rd(),m=rd(); memset(l,0x7f,sizeof l);
for(int i=1;i<=m;i++) l[n][i]=r[n][i]=i;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) high[i][j]=rd();
for(int i=1;i<=m;i++) if(!vis[1][i]) dfs(1,i);
bool flag=false;
int cnt=0;
for(int i=1;i<=m;i++)
{
if(!vis[n][i])
{
flag=true;
cnt++;
}
}
if(flag)
{
puts("0");
printf("%d",cnt);
return 0;
}
int left=1;
while(left<=m)
{
int maxr=0;
for(int i=1;i<=m;i++) if(l[1][i]<=left) maxr=max(maxr,r[1][i]);
cnt++;
left=maxr+1;
}
puts("1");
printf("%d",cnt);
}

NOIP2010 提高组合集的更多相关文章

  1. NOIP2011 提高组合集

    NOIP 2011 提高组合集 D1 T1 铺地毯 模拟,题目让你干啥你就干啥 #include <iostream> #include <cstdio> using name ...

  2. NOIP2015 提高组合集

    NOIP 2015 提高组 合集 D1 T1 神奇的幻方 题目让你干啥你就干啥,让你咋走你就咋走就完事儿了 #include <iostream> #include <cstdio& ...

  3. NOIP2014 提高组合集

    NOIP 2014 提高组 合集 D1 T1 生活大爆炸版石头剪刀布 首先,先将两个人的猜拳序列都变得不小于n.然后逐个模拟.胜败什么的看表就行了. #include <iostream> ...

  4. NOIP2013 提高组合集

    NOIP 2013 提高组 合集 D1 T1 转圈游戏 快速幂裸题 #include <iostream> #include <cstdio> #include <cst ...

  5. NOIP2012 提高组合集

    NOIP 2012 提高组 合集 D1 T1 Vigenère 密码 模拟题,观察到两个数对应位置-1相加的和%26就是对应的字母,按照这个性质模拟即可. #include <iostream& ...

  6. 洛谷 P1525 关押罪犯 & [NOIP2010提高组](贪心,种类并查集)

    传送门 解题思路 很显然,为了让最大值最小,肯定就是从大到小枚举,让他们分在两个监狱中,第一个不符合的就是答案. 怎样判断是否在一个监狱中呢? 很显然,就是用种类并查集. 种类并查集的讲解——团伙(很 ...

  7. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

  8. NOIP2010提高组乌龟棋 -SilverN

    题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起 ...

  9. NOIP2010提高组真题部分整理(没有关押罪犯)

    目录 \(NOIP2010\)提高组真题部分整理 \(T1\)机器翻译: 题目背景: 题目描述: 输入输出格式: 输入输出样例: 说明: 题解: 代码: \(T2\)乌龟棋 题目背景: 题目描述: 输 ...

随机推荐

  1. 浅谈算法——splay

    BST(二叉查找树)是个有意思的东西,种类巨TM多,然后我们今天不讲其他的,我们今天就讲splay 首先,如果你不知道Splay是啥,你也得知道BST是啥 如上图就是一棵优美的BST,它对于每个点保证 ...

  2. php pdo oracle

    <?php/** * Created by mestars. * User: mestars * Date: 6/13/16 * Time: 10:52 PM */header('Access- ...

  3. 378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [   [ 1,  5,  9],   [ ...

  4. 263 Ugly Number 丑数

    编写程序判断给定的数是否为丑数.丑数就是只包含质因子 2, 3, 5 的正整数.例如, 6, 8 是丑数,而 14 不是,因为它包含了另外一个质因子 7.注意:    1 也可以被当做丑数.    输 ...

  5. 我要上google

    我要上google 一.下载google浏览器(百度下载) 二.获取和运行xx-net 1.https://github.com/XX-net/XX-Net 2.解压下载的xx-net,运行文件夹中的 ...

  6. CF842C Ilya And The Tree

    思路: 1. 如果根节点是0,那么可以通过一次dfs计算出所有节点的最大值. 2. 如果根节点不是0,那么其余各点的最大值一定是根节点的一个因子.首先计算出根节点的所有因子.在dfs到一个深度为d的节 ...

  7. C++(存储类)经典!!

    C++变量的存储类别(动态存储.静态存储.自动变量.寄存器变量.外部变量)动态存储方式与静态存储方式 我们已经了解了变量的作用域.作用域是从空间的角度来分析的,分为全局变量和局部变量. 变量还有另一种 ...

  8. Assembly之instruction之JC

    JC Jump if carry setJHS  Jump if higher or same Syntax JC label JHS label Operation If C = 1: PC + 2 ...

  9. Discuz!伪静态原理分析

    伪静态在seo火热的时代,是每个站长都比较关注的问题,discuz!论坛如何伪静态,为什么伪静态失效了,为什么列表页无法实现伪静态,为什么有些页面不是伪静态呢?下面dz官方nxy105从两个角度入手为 ...

  10. LeetCode第63题--不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ).机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”).现在考虑网格中 ...