T1:机器翻译

题目背景

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。

题目描述

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。

假设内存中有MM个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-1M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入MM个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。

假设一篇英语文章的长度为NN个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

输入输出格式

输入格式:

共22行。每行中两个数之间用一个空格隔开。

第一行为两个正整数M,NM,N,代表内存容量和文章的长度。

第二行为NN个非负整数,按照文章的顺序,每个数(大小不超过10001000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

输出格式:

一个整数,为软件需要查词典的次数。

输入输出样例

输入样例#1: 复制

3 7
1 2 1 5 4 4 1
输出样例#1: 复制

5

说明

每个测试点1s1s

对于10\%10%的数据有M=1,N≤5M=1,N≤5。

对于100\%100%的数据有0≤M≤100,0≤N≤10000≤M≤100,0≤N≤1000。

整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:

空:内存初始状态为空。

1.11:查找单词1并调入内存。

2. 1 212:查找单词22并调入内存。

3. 1 212:在内存中找到单词11。

4. 1 2 5125:查找单词55并调入内存。

5. 2 5 4254:查找单词44并调入内存替代单词11。

6.2 5 4254:在内存中找到单词44。

7.5 4 1541:查找单词1并调入内存替代单词22。

共计查了55次词典。

题解:

其实不难看出是个队列题,
当队列未满时,若这个单词在内存中没有,便直接放在队尾,并且将这个单词打上存在标记,表示这个单词在内存中有;
当队列已满且仍有单词在内存中没有出现,则踢出队首,将队首的存在标记删除,并将这个单词放入队列,打上存在标记。
每重复以上操作ans++;
若单词存在,那自然是继续操作喽。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,x,ans,l,r,a[],b[];
int main() {
cin>>m>>n;
for(int i=; i<=n; i++) {
scanf("%d",&x);
if(a[x]==) {
ans++,r++,b[r]=x,a[x]=;
if(r>m) l++,a[b[l]]=;
}
}
cout<<ans;
return ;
}

T2 乌龟棋

题解:

取或不取,很容易就想到是到DP题。
但会不会做,又是另一回事了。
看着看着题,突然想起来之前有做过一道题,和这道题很像。
之前考DP的时候考过,当时好像就我一个A了?
哎呀,切入主题。
开一个四维的数组,
ans[i][j][k][q]表示当1有i张,2有j张,3有k张,4有q张时的得分。
引入一个flag数组记录1~4的牌每种有几张。
用四重循环来遍历一下四种牌的所有可能。
当然题目中说了乌龟棋子自动获得起点格子的分数。
所以当1~4的牌都不用的时候,ans[0][0][0][0]为起点点数。
循环过程中定义一个get_power=i+j+k+q。
因为ans[i][j][k][q]就等于上一次尝试最大值加上这次到达的格子的点数。
于是ans[i][j][k][q]=max(ans[i][j][k][q],ans?+num[get_power])
慢慢你会发现,这个,,,不是个背包思想吗。
于是根据背包思想,你就可以很愉快地写代码了。
哦对了,要注意判断i,j,k,q不能等于0,因为我们在与上一层比较时难免会遇到i-1啊j-1什么的。,
最后输出ans[flag[1]][flag[2]][flag[3]][flag[4]]就好了

代码:

#include<iostream>
int ans[][][][],num[],flag[],n,m,x;
int main() {
std::cin>>n>>m;
std::cin>>num[];
ans[][][][]=num[];
for(int i=; i<=n; i++)
std::cin>>num[i];
for(int i=; i<=m; i++)
std::cin>>x,flag[x]++;
for(int i=; i<=flag[]; i++)
for(int j=; j<=flag[]; j++)
for(int k=; k<=flag[]; k++)
for(int q=; q<=flag[]; q++) {
int get_power=+i+j*+k*+q*;
if(i!=) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i-][j][k][q]+num[get_power]);
if(j!=) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i][j-][k][q]+num[get_power]);
if(k!=) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i][j][k-][q]+num[get_power]);
if(q!=) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i][j][k][q-]+num[get_power]);
}
std::cout<<ans[flag[]][flag[]][flag[]][flag[]];
return ;
}

T3 关押罪犯

题解:

这里我用的并查集,出去学习的时候,老师们讲并查集时总会拿着个当例题。

于是在听过了几个老师巴拉巴拉地讲了好几遍后,埋头写这个题。

首先把所有冲突按照从大到小进行排序,然后进行操作。

检验,对于当前冲突的两个人是否能把他俩分开。

直到遇到两个人,他俩不可能被分开(如果分开了就跟前面冲突了),那他俩的冲突度就是最后的答案了。

利用并查集可以维护已知的一些人的关系。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
int x,y,z;
} f[];
int n,m,a[],b[];
bool cmp(node a,node b) {
return a.z>b.z;
}
int find(int x) {
if(a[x]==x) return x;
return a[x]=find(a[x]);
}
void ad(int x,int y) {
a[find(a[x])]=find(a[y]);
}
bool check(int x,int y) {
return find(x)==find(y)?:;
}
void add(int p,int mmp,int mml,int mmz) {
f[p].x=mmp,f[p].y=mml,f[p].z=mmz;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++) a[i]=i;
for(int i=,fa,fb,fc; i<=m; i++)
scanf("%d%d%d",&fa,&fb,&fc),add(i,fa,fb,fc);
sort(f+,f+m+,cmp);
for(int i=; i<=m+; 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 ad(b[f[i].x],f[i].y);
if(!b[f[i].y]) b[f[i].y]=f[i].x;
else ad(b[f[i].y],f[i].x);
}
}
return ;
}

T4 引水入城

题解:

当初考DP时,这是第三题,得了八十分还是多少分来着。鬼知道我为什么会得一个这么鬼畜的分。

记忆化搜索,我最讨厌搜索了。

鬼知道我为什么对于搜索看到的第一眼就是不喜欢。

但是,迫不得已,毕竟,学习学习嘛。

首先,第一问。

很好做,直接dfs或bfs求一下最下面一排的店有没有不能被覆盖到的就行了。

接下来第二问。

对第一排每个点进行dfs或bfs,搜出每个点能够覆盖到的区间,再做线段覆盖就行了。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct node{
int l,r;
}edge[];
int n,m,map[][],f[],cnt;
bool comp(node a,node b) {
return a.l<b.l;
}
bool vis[][],ans[];
void dfs(int x,int y,int tot) {
vis[x][y]=;
if(x==m) {
ans[y]=;
edge[tot].l=min(edge[tot].l,y);
edge[tot].r=max(edge[tot].r,y);
}
if(map[x+][y]<map[x][y]&&x!=m&&!vis[x+][y]) dfs(x+,y,tot);
if(map[x-][y]<map[x][y]&&x!=&&!vis[x-][y]) dfs(x-,y,tot);
if(map[x][y+]<map[x][y]&&y!=n&&!vis[x][y+]) dfs(x,y+,tot);
if(map[x][y-]<map[x][y]&&y!=&&!vis[x][y-]) dfs(x,y-,tot);
}
int main() {
cin>>m>>n;
for(int i=; i<=n; ++i) edge[i].l=f[i]=0x7fffffff;
for(int i=; i<=m; ++i)
for(int j=; j<=n; ++j)
cin>>map[i][j];
for(int i=; i<=n; ++i) {
memset(vis,,sizeof(vis));
dfs(,i,i);
}
for(int i=; i<=n; ++i)
if(!ans[i]) ++cnt;
if(cnt) printf("0\n%d\n",cnt);
else {
puts("");
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
if(i>=edge[j].l&&i<=edge[j].r)
f[i]=min(f[i],f[edge[j].l-]+);
printf("%d\n",f[n]);
}
return ;
}

一世安宁

noip 提高组 2010的更多相关文章

  1. noip提高组 2010 关押罪犯 (洛谷1525)

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

  2. NOIP提高组2010 关押罪犯

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

  3. NOIP提高组2010 乌龟棋

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

  4. 题解 【luogu P1541 NOIp提高组2010 乌龟棋】

    题目链接 题解 题意: 有一些格子,每个格子有一定分数. 给你四种卡片,每次可以使用卡片来前进1或2或3或4个格子并拾取格子上的分数 每张卡片有数量限制.求最大分数. 分析 设\(dp[i]\)为第前 ...

  5. 题解【luoguP1525 NOIp提高组2010 关押罪犯】

    题目链接 题解 算法: 一个经典的并查集 但是需要用一点贪心的思想 做法: 先将给的冲突们按冲突值从大到小进行排序(这很显然) 然后一个一个的遍历它们 如果发现其中的一个冲突里的两个人在同一个集合里, ...

  6. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  7. 计蒜客 NOIP 提高组模拟竞赛第一试 补记

    计蒜客 NOIP 提高组模拟竞赛第一试 补记 A. 广场车神 题目大意: 一个\(n\times m(n,m\le2000)\)的网格,初始时位于左下角的\((1,1)\)处,终点在右上角的\((n, ...

  8. 1043 方格取数 2000 noip 提高组

    1043 方格取数  2000 noip 提高组 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样 ...

  9. [NOIP提高组2018]货币系统

    [TOC] 题目名称:货币系统 来源:2018年NOIP提高组 链接 博客链接 CSDN 洛谷博客 洛谷题解 题目链接 LibreOJ(2951) 洛谷(P5020) 大视野在线评测(1425) 题目 ...

随机推荐

  1. 学习git踩坑之路

    第一次使用git: 1.使用CentOS Linux release 7.3.1611 (Core),内核版本3.10.0-514.el7.x86_64 2.安装git: root权限运行:yum   ...

  2. git中设置代理,本地不使用代理,针对域名设置代理

    想要的效果是: [1]本地IP不使用代理 [2]外网的仓库(如GitHub)使用代理 [3]适用于全局 方案 打开路径: C --> 用户 --> [我的账号] --> .gitco ...

  3. python新生类和经典类简单说明

    经典类: #!/usr/bin/env python #*-* coding:utf-8 *-* class A(): def __init__(self): print 'my name is GF ...

  4. entityFramework 中decimal精度缺失问题

    在entityFramework中,decimal精度默认为2位数,当要设置的精度大于2位并且数据库中设置的decimal精度大于2位时,则将数据保存在数据库中后两位的小数内容将强制为00 解决方案: ...

  5. You are not late! You are not early!

    Do you think you are going No Where in Life? STOP! Take a deep breathe THINK! New York is three hour ...

  6. It was not possible to find any compatible framework version

    It was not possible to find any compatible framework version The specified framework 'Microsoft.NETC ...

  7. js 排序,去重

    前几天 有一个需求要做一个 勾选的按钮 ,用的前端框架时 extjs   . 需求是这样的:选择数据后点击勾选 会把数据 放到一个全局变量里,然后点击另外一个提交按钮 弹出一个窗口 加载这些已经勾选的 ...

  8. 运行结果出现Process finished with exit code 0

    表示程序正常执行完毕并退出. 可以科普一下exit code,在大部分编程语言中都适用 exit code 0表示程序执行成功,正常退出 exit code 1表示执行过程中遇到了某些问题或者错误,非 ...

  9. Beta阶段第五次冲刺

    Beta阶段第五次冲刺 严格按照Git标准来,组员有上传Git的才有贡献分没有的为0 代码签入图 1.part1 -站立式会议照片 2.part2 -项目燃尽图 3.part3 -项目进展 1.正在进 ...

  10. U-Mail:如何实现EDM的个性化和定制化?

    设想一下,一个上班族一天要接到多少垃圾邮件?据媒体报道,目前来往的邮件中,高达95%以上的是垃圾邮件,而且有些垃圾邮件还会故意占据着邮箱的最前列.同时,随着人们接受资讯越来越快捷便利,渠道越来越多,也 ...