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. Android 内核--Binder架构分析

    一.Binder架构 在Android中,Binder用于完成进程间通信(IPC),即把多个进程关联在一起.比如,普通应用程序可以调用音乐播放服务提供的播放.暂停.停止等功能.Binder工作在Lin ...

  2. TCP中三次握手建立和四次握手释放以及相关问题

    本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...

  3. UVA.725 Division (暴力)

    UVA.725 Division (暴力) 题意分析 找出abcdefghij分别是0-9(不得有重复),使得式子abcde/fghij = n. 如果分别枚举每个数字,就会有10^10,肯定爆炸,由 ...

  4. AOJ 7.Redraiment猜想

    Redraiment猜想 Description redraiment在家极度无聊,于是找了张纸开始统计素数的个数. 设函数f(n)返回从1->n之间素数的个数. redraiment发现: f ...

  5. HDU 2700

    Parity Time Limit: 2000/1000 MS(Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. foo.prototype作为新对象的原型来使用

    最近在研究js,疑惑也比较多.主要是被原型这个东西给弄迷糊了.疑惑出自于: function foo { this.name = 'foo'; } alert(foo.prototype === Fu ...

  7. Application Error - The connection to the server was unsuccessful. (file:///android_asset/www/index.html)

    问题描述: PhoneGap+Sencha Touch开发的应用,打包后的APP或者调试期间,在启动的时候提示如下信息: Application Error - The connection to t ...

  8. supervisor安装、配置和运行

    supervisor是python写的进程管理工具,supervisor能够批量对进程执行启动,停止,重启等操作,有效提高了运维效率.注意supervisor只能管理前台进程,supervisor会自 ...

  9. 名人问题/名流问题/Celebrity

    问题描述:名人问题一个名人就是指这样一个人:所有其他人都认识他,并且他不认识任何其他人.现在有一个N个人的集合,以及他们之间的认识关系.求一个算法找出其中的名人(如果有的话)或者判断出没有名人(如果没 ...

  10. Webservice与CXF框架快速入门

    1. Webservice Webservice是一套远程调用技术规范 远程调用RPC, 实现了系统与系统进程间的远程通信.java领域有很多可实现远程通讯的技术,如:RMI(Socket + 序列化 ...