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 ...
随机推荐
- SpreadJS电子表格
SpreadJS是wijmo旗下的一款HTML5电子表格控件. 官方网址:http://wijmo.com/products/spreadjs/ 在这里简单整理了SpreadJS几个比较简单的特点,如 ...
- VFP MSSOAPTOOKIT 使用SOAP Headers
.NET 有如下使用了自定义扩展HEADER来做验证 server.asmx代码 using System;using System.Collections.Generic;using System ...
- 移植milo的全局光照渲染器代码
测试flascc的性能优化程度,http://bbs.9ria.com/thread-162705-1-1.html . 可以对比下猫粮的http://bbs.9ria.com/thread-5820 ...
- 利用docker compose启动gitlab及runner
添加docker compose配置文件 新建文件docker-compose.yml,输入如下内容: gitlab: image: 'gitlab/gitlab-ce:latest' contain ...
- 关于UI系统的问题
function OnGUI(){ GUI.skin = myskin; if(GUILayout.Button("add_component",GUILayout.Height( ...
- redis make时 提示 zmalloc.h:50:31: error: jemalloc/jemalloc.h:
redis安装需要环境必备 gcc 但是若未先安装好gcc,make失败后再次 make 会提示如下错误 zmalloc.h:50:31: error: jemalloc/jemalloc.h: 这时 ...
- mave的变量说明
Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和Maven Settings env env变量,暴露了你操作系统或者shell的环境变量.便 如在Maven POM中一个对${en ...
- 理解View与Model分离
说实话MV*架构中,Model与View分离已经听人谈了好久,但是以前始终没太弄懂什么意思,最近终于稍微懂了一些,虽然不一定很对,暂且先记录下来. 谈Model与View分离,首先要弄懂页面在前端渲染 ...
- 特殊字符(包含emoji)的梳理
背景知识 emoji表情符号,是20世纪90年代由NTT Docomo栗田穣崇(Shigetaka Kurit)创建的,词义来自日语(えもじ,e-moji,moji在日语中的含义是字符).emoji可 ...
- Nginx Location配置总结
Nginx Location配置总结 语法规则: location [=|~|~*|^~] /uri/ { - }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即 ...