NOIP2010 题解
机器翻译
题解:模拟
- #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 题解的更多相关文章
- NOIP2010题解
所有题目链接均来自洛谷 T1机器翻译 原题戳这里 自古T1是水题 因为每一个数字都小于1000,所以对于是否在队列中可以开数组查询 对于大小的限制,弄一个队列维护大小即可(水题呀...) 这题在Win ...
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- 题解 【NOIP2010】关押罪犯
[NOIP2010]关押罪犯 Description S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突 ...
- 题解【洛谷P1514】[NOIP2010]引水入城
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...
- noip2010提高组3题题解 by rLq
本题地址http://www.luogu.org/problem/show?pid=1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和 ...
- NOIP2010普及组题解 -SilverN
三国游戏 题目内容不放了 由于电脑总是会拆掉最大的组合,所以玩家最多只能得到数值第二大的组合 那么找出第二大的组合就行了 #include<iostream> #include<cs ...
- NOIP2010 引水入城 题解
http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市 ...
- 【题解】[Noip2010]机器翻译-C++
题目Description小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章.这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件 ...
- luoguP1541 乌龟棋 题解(NOIP2010)
P1541 乌龟棋 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cma ...
随机推荐
- ASP.NET泛型List的各种用法Skip、Take等
List在.NET里面使用得非常频繁,但有好多人不了解它各种小用法.我就一直记不大住... asp.net中List的简单用法,例如: 1 2 3 4 5 6 7 List<int> li ...
- C#删除datable空行
//去除dataTable空行 public DataTable RemoveEmpty(DataTable dt) { List<DataRow> removelist = new Li ...
- lua和整合实践
这几天研究了一下lua,主要关注的是lua和vc之间的整合,把代码都写好放在VC宿主程序里,然后在lua里调用宿主程序的这些代码(或者叫接口.组件,随便你怎么叫),希望能用脚本来控制主程序的行为.这实 ...
- iOS开发笔记之Runtime实用总结
前言 runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的.另外runtime的知识还有很多,想要了解更多 ...
- python初学day01
1.执行Python脚本时打印的字符有颜色 1. print "\033[32;1mhello\033[0m" #打印绿色 2. print "\033[31;1mhel ...
- 第一章 删掉centos原有的openjdk并安装sun jdk
一.卸载原有openjdk rpm -qa | grep java 之后,将展示出来的全部卸载掉,我这里是5个 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111 ...
- 一个div,包含三个小的div,平均分布的样式
从11月份开始,自学前端开发,写静态页面中,经常用到一个大的div下包含三个小的div,平均分布div大小样式,写过多次,也多次忘记,每次都要现找资料,不想之后,在这么麻烦,索性今天自己记录一下,方便 ...
- python 整齐输出与编码读写
# -*- coding:utf-8 -*- # Author:mologa for x in range(1,11): print(repr(x).rjust(2),repr(x*x).rjust( ...
- [刘阳Java]_斗胆介绍一下Eclipse快捷键大全[超详细]_第6讲
斗胆让我在这里介绍一下Eclipse快捷键有哪些 ctrl+shirt+r 打开资源 这组快捷键可以让你开打Eclipse工作区中任何一个文件,你只需要输入你想查找的文件名字即可,而且绝对支持模糊检索 ...
- Python:进程
由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...