机器翻译

  题解:模拟

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. const int MAXN = ;
  5.  
  6. int n, m, cj, now, MinV, MinId, Pri, a[MAXN+], in[MAXN+];
  7.  
  8. int main(){
  9. memset(in, -, sizeof(in));
  10. scanf("%d %d", &n, &m), now = Pri = ;
  11. for (int i=; i<m; i++){
  12. scanf("%d", &cj);
  13. if (~in[cj]) continue;
  14. Pri ++;
  15. if (now+<=n) now ++, in[cj] = i;
  16. else {
  17. MinV = 0x3f3f3f3f;
  18. for (int j=; j<=MAXN; j++)
  19. if (in[j]<MinV && in[j]!=-) MinV = in[j], MinId = j;
  20. in[MinId] = -, in[cj] = i;
  21. }
  22. }
  23. printf("%d\n", Pri);
  24. }

translate.cpp

乌龟棋

  题解:dp

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. const int MAXN = +;
  5. const int MAXE = +;
  6.  
  7. int n, m, cj, a[MAXN], b[], dp[MAXE][MAXE][MAXE][MAXE];
  8.  
  9. int main(){
  10. memset(dp, , sizeof(dp));
  11.  
  12. scanf("%d %d", &n, &m);
  13. for (register int i=; i<n; i++)
  14. scanf("%d", &a[i]);
  15. for (register int i=; i<m; i++)
  16. scanf("%d", &cj), b[cj] ++;
  17.  
  18. dp[][][][] = a[];
  19. for (register int A=; A<=b[]; A++)
  20. for (register int B=; B<=b[]; B++)
  21. for (register int C=; C<=b[]; C++)
  22. for (register int D=; D<=b[]; D++){
  23. cj = A+B+B+C+C+C+D+D+D+D;
  24. 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];
  25. 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];
  26. 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];
  27. 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];
  28. }
  29. printf("%d\n", dp[b[]][b[]][b[]][b[]]);
  30. }

tortoise.cpp

关押罪犯

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

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

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

  1. #include <cstdio>
  2. #include <algorithm>
  3. using std::sort;
  4.  
  5. const int MAXN = +;
  6. const int MAXM = +;
  7.  
  8. int n, m, f[MAXN*];
  9.  
  10. struct Relation{
  11. int a, b, c;
  12.  
  13. friend bool operator < (const Relation& A, const Relation& B){
  14. return A.c>B.c;
  15. }
  16. }r[MAXM];
  17.  
  18. inline int Find(int x){
  19. return f[x]==x ? x : f[x] = Find(f[x]);
  20. }
  21.  
  22. inline int Solve(){
  23. sort(r, r+m);
  24. int a, b;
  25. for (int i=; i<m; i++){
  26. a = Find(r[i].a), b = Find(r[i].b);
  27. if (a==b) return r[i].c;
  28. else f[a] = Find(r[i].b+n), f[b] = Find(r[i].a+n);
  29. }
  30. return ;
  31. }
  32.  
  33. int main(){
  34. scanf("%d %d", &n, &m);
  35. for (int i=; i<=*n; i++)
  36. f[i] = i;
  37. for (int i=; i<m; i++)
  38. scanf("%d %d %d", &r[i].a, &r[i].b, &r[i].c);
  39.  
  40. printf("%d\n", Solve());
  41. }

prison.cpp

引水入城

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

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

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. const int MAXN = +;
  5. const int addX[] = {-, , , };
  6. const int addY[] = {, , -, };
  7.  
  8. int n, m, X, Y, Need, Cant, anna[MAXN][MAXN];
  9. bool vis[MAXN][MAXN];
  10.  
  11. struct Region{
  12. int l, r;
  13. }rg[MAXN];
  14.  
  15. inline int findLeft(){
  16. for (int i=; i<=m; i++)
  17. if (vis[n][i]) return i;
  18. return ;
  19. }
  20.  
  21. inline int findRight(){
  22. for (int i=m; i>=; i--)
  23. if (vis[n][i]) return i;
  24. return ;
  25. }
  26.  
  27. inline void DFS(int x, int y){
  28. if (x< || x>n || y< || y>m) return;
  29. vis[x][y] = true;
  30.  
  31. for (int i=; i<; i++){
  32. X = x+addX[i], Y = y+addY[i];
  33. if (<=X && X<=n && <=Y && Y<=m && anna[X][Y]<anna[x][y] && !vis[X][Y])
  34. DFS(X, Y);
  35. }
  36. }
  37.  
  38. inline bool legal(){
  39. memset(vis, false, sizeof(vis));
  40.  
  41. for (int i=; i<=m; i++)
  42. DFS(, i);
  43.  
  44. for (int i=; i<=m; i++)
  45. if (not vis[n][i]) ++ Cant;
  46.  
  47. return !Cant;
  48. }
  49.  
  50. inline int segmentCover(){
  51. for (int i=; i<=m; i++){
  52. memset(vis, false, sizeof(vis));
  53. DFS(, i);
  54. rg[i].l = findLeft(), rg[i].r = findRight();
  55. }
  56.  
  57. int i = , j, k = ;
  58. while (i<=m){
  59. for (j=; j<=m; j++)
  60. if (rg[j].l<=i && rg[j].r>k) k = rg[j].r;
  61. i = k+, ++ Need;
  62. }
  63.  
  64. return Need;
  65. }
  66.  
  67. int main(){
  68. memset(anna, 0x3f, sizeof(anna));
  69.  
  70. scanf("%d %d", &n, &m), Cant = Need = ;
  71. for (int i=; i<=n; i++)
  72. for (int j=; j<=m; j++)
  73. scanf("%d", &anna[i][j]);
  74.  
  75. if (legal()) printf("1\n%d", segmentCover());
  76. else printf("0\n%d", Cant);
  77. }

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. ASP.NET泛型List的各种用法Skip、Take等

    List在.NET里面使用得非常频繁,但有好多人不了解它各种小用法.我就一直记不大住... asp.net中List的简单用法,例如: 1 2 3 4 5 6 7 List<int> li ...

  2. C#删除datable空行

    //去除dataTable空行 public DataTable RemoveEmpty(DataTable dt) { List<DataRow> removelist = new Li ...

  3. lua和整合实践

    这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...

  4. iOS开发笔记之Runtime实用总结

    前言 runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的.另外runtime的知识还有很多,想要了解更多 ...

  5. python初学day01

    1.执行Python脚本时打印的字符有颜色 1. print "\033[32;1mhello\033[0m" #打印绿色 2. print "\033[31;1mhel ...

  6. 第一章 删掉centos原有的openjdk并安装sun jdk

    一.卸载原有openjdk rpm -qa | grep java 之后,将展示出来的全部卸载掉,我这里是5个 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111 ...

  7. 一个div,包含三个小的div,平均分布的样式

    从11月份开始,自学前端开发,写静态页面中,经常用到一个大的div下包含三个小的div,平均分布div大小样式,写过多次,也多次忘记,每次都要现找资料,不想之后,在这么麻烦,索性今天自己记录一下,方便 ...

  8. python 整齐输出与编码读写

    # -*- coding:utf-8 -*- # Author:mologa for x in range(1,11): print(repr(x).rjust(2),repr(x*x).rjust( ...

  9. [刘阳Java]_斗胆介绍一下Eclipse快捷键大全[超详细]_第6讲

    斗胆让我在这里介绍一下Eclipse快捷键有哪些 ctrl+shirt+r 打开资源 这组快捷键可以让你开打Eclipse工作区中任何一个文件,你只需要输入你想查找的文件名字即可,而且绝对支持模糊检索 ...

  10. Python:进程

    由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...