tags:

机器翻译

Solution

  维护一个队列, 每次从词典中查词时将单词加入队列(代表内存), 当内存满的时候, 从队首弹出一个代表清空最早的单词.

Code

#include<iostream>
#include<cstdio>
#include<queue>
#define N 1005
using namespace std; queue<int>que;
int vis[N]; int main(){
int n,m,q,ans=0;
scanf("%d%d",&m,&n);
for(int i=1;i<=n;++i){
scanf("%d",&q);
if(!vis[q]){
if(que.size()==m){
vis[que.front()]=false;
que.pop();
}
que.push(q);
vis[q]=1;
ans++;
}
}
printf("%d",ans);
return 0;
}

乌龟棋

Solution

  比较原始的动态规划, \(f(i,j,k,l)\)表示使用了\(i,j,k,l\)张\(1,2,3,4\)的牌, 然后依次枚举\(l,k,j,i\)来更新\(f(i,j,k,l)\).

Code

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#define N 45
using namespace std; int dp[N][N][N][N];
int s1,s2,s3,s4;
int value[505];
int n,m,s; int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&value[i]);
for(int i=1;i<=m;++i){
scanf("%d",&s);
if(s==1)s1++;if(s==2)s2++;
if(s==3)s3++;if(s==4)s4++;
}
int ans=0;
for(int d=0;d<=s4;++d)
for(int c=0;c<=s3;++c)
for(int b=0;b<=s2;++b)
for(int a=0;a<=s1;++a){
int siz=a+b*2+c*3+d*4;
if(siz>n)continue;
dp[a][b][c][d]+=value[siz+1];
int ma=dp[a][b][c][d];
if(a)ma=max(ma,dp[a-1][b][c][d]+value[siz+1]);
if(b)ma=max(ma,dp[a][b-1][c][d]+value[siz+1]);
if(c)ma=max(ma,dp[a][b][c-1][d]+value[siz+1]);
if(d)ma=max(ma,dp[a][b][c][d-1]+value[siz+1]);
dp[a][b][c][d]=ma;
// cout<<dp[a][b][c][d]<<endl;
if(siz+1==n)ans=max(ma,ans);
}
printf("%d",ans);
// system("pause");
return 0;
}

关押罪犯

做法

  并查集, 最开始有\(2n\)个集合, 代表每个点所属的集合和敌对的人所属的集合, 然后将所有敌对关系从大到小排序, 依次将一个点加入另一个点的敌对集合, 直到无法再加时就是最终的答案.

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#define N 515
#define inf 0x3f3f3f3f
using namespace std; int dx[N]={0,0,-1,1};
int dy[N]={1,-1,0,0};
int h[N][N];
int be[N][N];
int also[N];
bool vis[N][N];
int n,m;
int color;
int flag=inf,en;
int visit[N]; struct Segment{
int u,v;
inline bool operator<(const Segment& s)const{
if(v!=s.v)return v>s.v;return u<s.u;
}
}e[N];
int tot; inline bool Chu(int x,int y){
if(x<1||y<1||x>n||y>m)return false;
return true;
} void dfs(int x,int y,int f){
vis[x][y]=true;
for(int i=0;i<4;++i){
int xx=dx[i]+x,yy=dy[i]+y;
if(vis[xx][yy])continue;
if(!Chu(xx,yy))continue;
if(h[xx][yy]>=h[x][y])continue;
be[xx][yy]=f;
if(xx==n)flag=min(flag,yy),en=max(en,yy);
dfs(xx,yy,f);
}
} int main(){
scanf("%d%d",&n,&m);
if(n==1){
cout<<"1\n4";
return 0;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&h[i][j]);
// cout<<"*****************\n";
for(int i=1;i<=m;++i){
memset(vis,false,sizeof(vis));
if(h[1][i-1]>h[1][i])continue;
if(h[1][i+1]>h[1][i])continue;
flag=inf;
dfs(1,i,i);if(flag==inf)continue;
e[++tot]=(Segment){flag,en};
// cout<<flag<<' '<<en<<' '<<i<<endl;
}
int ans=0;
for(int i=1;i<=m;++i){
if(!be[n][i])++ans;
// cout<<be[n][i]<<' ';
}
if(ans){
printf("0\n%d",ans);
return 0;
}
int l,r=1;int maxl,pos;ans=0;
while(r<m+1){
for(int i=1;i<=tot;++i){
if(e[i].v>500||e[i].u>500)break;
if(e[i].u<=r&&!visit[i])
if(e[i].v>maxl){
pos=i,maxl=e[i].v;
}
}
visit[pos]=true;
r=maxl+1;ans++;
} if(!ans)ans=1;
printf("1\n%d",ans);
// system("pause");
return 0;
}

引水入城

Solution

  并没有像他们说的那样会超时, 虽然使用了非常暴力的做法来处理.首先找出每个点能覆盖的处在沙漠中点的区间.然后做线段覆盖, 我处理的真的是非常随便.注意有一个数据是沙漠也是城市, 特判过; 另外如果一个临湖点比另一个一个相邻的点低, 就不需要遍历这个点了, 因为是肯定是它的子集.

Code

#include<iostream>
#include<cstring>
#include<cstdio>
#define N 515
#define inf 0x3f3f3f3f
using namespace std; int dx[N]={0,0,-1,1};
int dy[N]={1,-1,0,0};
int h[N][N];
int be[N][N];
int also[N];
bool vis[N][N];
int n,m;
int color;
int flag=inf,en;
int visit[N]; struct Segment{
int u,v;
inline bool operator<(const Segment& s)const{
if(v!=s.v)return v>s.v;return u<s.u;
}
}e[N];
int tot; inline bool Chu(int x,int y){
if(x<1||y<1||x>n||y>m)return false;
return true;
} void dfs(int x,int y,int f){
vis[x][y]=true;
for(int i=0;i<4;++i){
int xx=dx[i]+x,yy=dy[i]+y;
if(vis[xx][yy])continue;
if(!Chu(xx,yy))continue;
if(h[xx][yy]>=h[x][y])continue;
be[xx][yy]=f;
if(xx==n)flag=min(flag,yy),en=max(en,yy);
dfs(xx,yy,f);
}
} int main(){
scanf("%d%d",&n,&m);
if(n==1){
cout<<"1\n4";
return 0;
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&h[i][j]);
// cout<<"*****************\n";
for(int i=1;i<=m;++i){
memset(vis,false,sizeof(vis));
if(h[1][i-1]>h[1][i])continue;
if(h[1][i+1]>h[1][i])continue;
flag=inf;
dfs(1,i,i);if(flag==inf)continue;
e[++tot]=(Segment){flag,en};
// cout<<flag<<' '<<en<<' '<<i<<endl;
}
int ans=0;
for(int i=1;i<=m;++i){
if(!be[n][i])++ans;
// cout<<be[n][i]<<' ';
}
if(ans){
printf("0\n%d",ans);
return 0;
}
int l,r=1;int maxl,pos;ans=0;
while(r<m+1){
for(int i=1;i<=tot;++i){
if(e[i].v>500||e[i].u>500)break;
if(e[i].u<=r&&!visit[i])
if(e[i].v>maxl){
pos=i,maxl=e[i].v;
}
}
visit[pos]=true;
r=maxl+1;ans++;
} if(!ans)ans=1;
printf("1\n%d",ans);
// system("pause");
return 0;
}

NOIP 2010的更多相关文章

  1. 洛谷 P1525 关押罪犯==codevs 1069 关押罪犯[NOIP 2010]

    P1525 关押罪犯 513通过 1.4K提交 题目提供者该用户不存在 标签图论并查集NOIp提高组2010 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 咳咳.竟MLE了. 囧.运行时错误 ...

  2. NOIp 2010/Luogu P1525 关押罪犯 【二分图/并查集】 By cellur925

    题目传送门 感想:相信自己的想法!继续挖掘! 读完题目后:看到的最大值最小?二分答案啊!再仔细一看:wi达到了1e9,二分可能费点劲.(其实真的是可以的)而且check函数貌似并没有什么行之有效的写法 ...

  3. NOIP 2010题解

    唔..NOIP2010比较简单,总体感觉不错. Problem 1: 机器翻译 水题,队列的简单应用. 读入时判断是否在内存中,可以用hash优化.如果不在内存中push进内存,放不下了pop hea ...

  4. noip 2010 关押罪犯 (二分图染色 并茶几)

    /* 二分图染色版本 两个监狱对应二部图的两部分 在给定的怨气值里二分 对于每一个Ci 进行染色判断是否合法 染色的时候 如果这条边的ci > Ci 这两个人就带分开 即染成不同的颜色 如果染色 ...

  5. [NOIP 2010]饮水入城 搜索+贪心

    考试的时候写了个dfs找出来了,最后处理的时候想到了贪心,但是正确性没有想通.然后想了想动规,也没想通.最后没办法,用状态的话用了个状压,弄了40分. 正解是bfs+贪心.Dfs也有过的. 下面题解引 ...

  6. [NOIP 2010] 引水入城

    搜索+贪心. 参考博客:http://blog.sina.com.cn/s/blog_8442ec3b0100xib1.html 主要是要看出来,如果有解的话,每个沿湖城市能够流到的范围是连续的区间. ...

  7. noip 2010 三国游戏

    三国游戏 三国游戏 描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有N 位武将(N为偶数且不小于4),任 ...

  8. noip 2010 关押罪犯 二分答案+二分图染色 || 并查集

    题目链接 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值&q ...

  9. noip 2010 数字统计

    数位dp解水题 luogu1179 dp[i][j]表示 有i位,且首位是j(包括0) 的 ‘2’的个数 dp[i][j]={ Σ(dp[i-1][k]),j!=2; Σ(dp[i-1][k])+va ...

随机推荐

  1. codevs5037 线段树练习4加强版(暴力分块)

    求大爷教线段树怎么写啊QAQ 只会写分块...一开始脑抽写成了O(NKlogN)还被CZL大爷嘲讽了一发T T f[i][j]表示在第i块中,模k为j的数有几个,然后每次修改的时候只需要打个标记,查询 ...

  2. bzoj1968: [Ahoi2005]COMMON 约数研究(数论)

    计算每一个数的贡献就好了..O(N) n/i只有2*sqrtn个取值于是可以优化到O(sqrtn) #include<bits/stdc++.h> #define ll long long ...

  3. JavaScript截取中英文字符串

    有时在显示某段文字的时候,可能会太长,影响我们页面的显示效果.如果仅是英文,那么我们可以用String.substring(start, end)函数就已经够用了.但是通常我们都会遇到既有英文,又有汉 ...

  4. IntelliJ IDEA 详细图解最常用的配置 ,适合新人,解决eclipse转idea的烦恼

    刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工. 比如:设置文件字体大小,代码自动完成提示,版本管理,本地代码历史,自动导入包,修改注释,修改tab的 ...

  5. Linux下 ps -ef 和 ps aux 的区别及格式详解

    原文:https://www.cnblogs.com/5201351/p/4206461.html Linux下ps -ef和ps aux的区别及格式详解 Linux下显示系统进程的命令ps,最常用的 ...

  6. postgresql pgagent 的安装及使用

    pgagent 作为postgresql的一个任务调度代理,在postgresql 9.0 以前 是附带在pgadmin 包下面的,只是默认不安装,9.0之后作为了一个单独是的安装包.所以要使用pga ...

  7. openstack安装问题

    KeyStone NoHandlers Errorroot@openstack-dev-r910:/home/brent/openstack# ./keystone_data.shNo handler ...

  8. 在浏览器输入网址,Enter之后发生的事情

    简介: 1. 浏览器接收域名 2. 发送域名给DNS,中文名字是域名系统服务器,一般位于ISP(互联网服务提供商,比如我们熟知的联通.移动.电信等) 中.浏览器会首先发给离自己最近的DNS,DNS收到 ...

  9. 温习js中对象的继承

    温故而知新 XD 1. 关于原型和构造函数的几个知识要点: 使用new 操作符调用构造函数,会经历以下四个步骤: 1.1. 创建一个新对象: 1.2. 将构造函数的作用域赋给新对象(因此 this 就 ...

  10. 超酷算法-BK树

    前几天无意间遇到一个博客,觉得写得挺好的,自己之前的时候有个不好的习惯,那就是遇到了好资源第一反应就是收藏起来然后却很少再看!!这是坏习惯,要改!于是今天就开始通读了,读的第二篇是BK树.觉得有点意思 ...