机器翻译

  题解:模拟

 #include <cstdio>
#include <cstring> const int MAXN = ; int n, m, cj, now, MinV, MinId, Pri, a[MAXN+], in[MAXN+]; int main(){
memset(in, -, sizeof(in));
scanf("%d %d", &n, &m), now = Pri = ;
for (int i=; i<m; i++){
scanf("%d", &cj);
if (~in[cj]) continue;
Pri ++;
if (now+<=n) now ++, in[cj] = i;
else {
MinV = 0x3f3f3f3f;
for (int j=; j<=MAXN; j++)
if (in[j]<MinV && in[j]!=-) MinV = in[j], MinId = j;
in[MinId] = -, in[cj] = i;
}
}
printf("%d\n", Pri);
}

translate.cpp

乌龟棋

  题解:dp

 #include <cstdio>
#include <cstring> const int MAXN = +;
const int MAXE = +; int n, m, cj, a[MAXN], b[], dp[MAXE][MAXE][MAXE][MAXE]; int main(){
memset(dp, , sizeof(dp)); scanf("%d %d", &n, &m);
for (register int i=; i<n; i++)
scanf("%d", &a[i]);
for (register int i=; i<m; i++)
scanf("%d", &cj), b[cj] ++; dp[][][][] = a[];
for (register int A=; A<=b[]; A++)
for (register int B=; B<=b[]; B++)
for (register int C=; C<=b[]; C++)
for (register int D=; D<=b[]; D++){
cj = A+B+B+C+C+C+D+D+D+D;
if (A && dp[A-][B][C][D]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A-][B][C][D]+a[cj];
if (B && dp[A][B-][C][D]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A][B-][C][D]+a[cj];
if (C && dp[A][B][C-][D]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A][B][C-][D]+a[cj];
if (D && dp[A][B][C][D-]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A][B][C][D-]+a[cj];
}
printf("%d\n", dp[b[]][b[]][b[]][b[]]);
}

tortoise.cpp

关押罪犯

  题解:并查集。既然只有两个监狱,那么如果a和b没有在一个监狱,b和c没有在一个监狱,那么a和c一定在一个监狱

  把怒气值从大到小拍个序,依次处理

  并查集[1, n]表示和自己一起的,[n+1, 2n]表示不和自己一起的

 #include <cstdio>
#include <algorithm>
using std::sort; const int MAXN = +;
const int MAXM = +; int n, m, f[MAXN*]; struct Relation{
int a, b, c; friend bool operator < (const Relation& A, const Relation& B){
return A.c>B.c;
}
}r[MAXM]; inline int Find(int x){
return f[x]==x ? x : f[x] = Find(f[x]);
} inline int Solve(){
sort(r, r+m);
int a, b;
for (int i=; i<m; i++){
a = Find(r[i].a), b = Find(r[i].b);
if (a==b) return r[i].c;
else f[a] = Find(r[i].b+n), f[b] = Find(r[i].a+n);
}
return ;
} int main(){
scanf("%d %d", &n, &m);
for (int i=; i<=*n; i++)
f[i] = i;
for (int i=; i<m; i++)
scanf("%d %d %d", &r[i].a, &r[i].b, &r[i].c); printf("%d\n", Solve());
}

prison.cpp

引水入城

  题解:看懂题是关键...

     多么痛的领悟:windows下只能bfs,linux下就怎么搞都可以了TAT

 #include <cstdio>
#include <cstring> const int MAXN = +;
const int addX[] = {-, , , };
const int addY[] = {, , -, }; int n, m, X, Y, Need, Cant, anna[MAXN][MAXN];
bool vis[MAXN][MAXN]; struct Region{
int l, r;
}rg[MAXN]; inline int findLeft(){
for (int i=; i<=m; i++)
if (vis[n][i]) return i;
return ;
} inline int findRight(){
for (int i=m; i>=; i--)
if (vis[n][i]) return i;
return ;
} inline void DFS(int x, int y){
if (x< || x>n || y< || y>m) return;
vis[x][y] = true; for (int i=; i<; i++){
X = x+addX[i], Y = y+addY[i];
if (<=X && X<=n && <=Y && Y<=m && anna[X][Y]<anna[x][y] && !vis[X][Y])
DFS(X, Y);
}
} inline bool legal(){
memset(vis, false, sizeof(vis)); for (int i=; i<=m; i++)
DFS(, i); for (int i=; i<=m; i++)
if (not vis[n][i]) ++ Cant; return !Cant;
} inline int segmentCover(){
for (int i=; i<=m; i++){
memset(vis, false, sizeof(vis));
DFS(, i);
rg[i].l = findLeft(), rg[i].r = findRight();
} int i = , j, k = ;
while (i<=m){
for (j=; j<=m; j++)
if (rg[j].l<=i && rg[j].r>k) k = rg[j].r;
i = k+, ++ Need;
} return Need;
} int main(){
memset(anna, 0x3f, sizeof(anna)); scanf("%d %d", &n, &m), Cant = Need = ;
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
scanf("%d", &anna[i][j]); if (legal()) printf("1\n%d", segmentCover());
else printf("0\n%d", Cant);
}

flow.cpp

NOIP2010 题解的更多相关文章

  1. NOIP2010题解

    所有题目链接均来自洛谷 T1机器翻译 原题戳这里 自古T1是水题 因为每一个数字都小于1000,所以对于是否在队列中可以开数组查询 对于大小的限制,弄一个队列维护大小即可(水题呀...) 这题在Win ...

  2. noip2010提高组题解

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

  3. 题解 【NOIP2010】关押罪犯

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

  4. 题解【洛谷P1514】[NOIP2010]引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  5. noip2010提高组3题题解 by rLq

    本题地址http://www.luogu.org/problem/show?pid=1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和 ...

  6. NOIP2010普及组题解 -SilverN

    三国游戏 题目内容不放了 由于电脑总是会拆掉最大的组合,所以玩家最多只能得到数值第二大的组合 那么找出第二大的组合就行了 #include<iostream> #include<cs ...

  7. NOIP2010 引水入城 题解

    http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...

  8. 【题解】[Noip2010]机器翻译-C++

    题目Description小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章.这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件 ...

  9. luoguP1541 乌龟棋 题解(NOIP2010)

    P1541 乌龟棋 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cma ...

随机推荐

  1. python基础知识7——迭代器,生成器,装饰器

    迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...

  2. Redis从基础命令到实战之散列类型(Hash)

    从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...

  3. CListCtlr 控件的常见用法

    今天第一次用CListCtrl控件,遇到不少问题,查了许多资料,现将用到的一些东西总结如下: 以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtr ...

  4. 316. Remove Duplicate Letters

    Given a string which contains only lowercase letters, remove duplicate letters so that every letter ...

  5. Linux驱动学习之驱动开发准备工作

    一.开启驱动开发之路 1.驱动开发的准备工作 (1)正常运行linux系统的开发板.要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的.原因在于在安装模块的时候会进行安全性校验 ...

  6. MIME Type

    一.首先,我们要了解浏览器是如何处理内容的.在浏览器中显示的内容有 HTML.有 XML.有 GIF.还有 Flash --那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 MIME ...

  7. oracle 异常

    ORACLE 异常错误处理 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 ...

  8. Python—判断变量的基本类型

    type() >>> type(123)==type(456) True >>> type(123)==int True >>> type('ab ...

  9. 北邮oj 题

    题目描述 Every year,prince prepares a birthday gift for princess.The gift is a box,which is decorated wi ...

  10. ubuntu14.04安装bodhi桌面系统后,unity启动界面改变,如何还原

    按一下 ctrl + alt + f1 # 出現 tty11. sudo service lxdm stop或sudo /etc/init.d/lxdm stop如果出現錯誤訊息 不理它 繼續2. s ...