NOIP2010 题解

机器翻译

  题解:模拟

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 const int MAXN = 1000;
 5
 6 int n, m, cj, now, MinV, MinId, Pri, a[MAXN+10], in[MAXN+10];
 7
 8 int main(){
 9     memset(in, -1, sizeof(in));
10     scanf("%d %d", &n, &m), now = Pri = 0;
11     for (int i=0; i<m; i++){
12         scanf("%d", &cj);
13         if (~in[cj]) continue;
14         Pri ++;
15         if (now+1<=n) now ++, in[cj] = i;
16         else {
17             MinV = 0x3f3f3f3f;
18             for (int j=0; j<=MAXN; j++)
19                 if (in[j]<MinV && in[j]!=-1) MinV = in[j], MinId = j;
20             in[MinId] = -1, 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 = 350+2;
 5 const int MAXE = 40+2;
 6
 7 int n, m, cj, a[MAXN], b[6], dp[MAXE][MAXE][MAXE][MAXE];
 8
 9 int main(){
10     memset(dp, 0, sizeof(dp));
11
12     scanf("%d %d", &n, &m);
13     for (register int i=0; i<n; i++)
14         scanf("%d", &a[i]);
15     for (register int i=0; i<m; i++)
16         scanf("%d", &cj), b[cj] ++;
17
18     dp[0][0][0][0] = a[0];
19     for (register int A=0; A<=b[1]; A++)
20         for (register int B=0; B<=b[2]; B++)
21             for (register int C=0; C<=b[3]; C++)
22                 for (register int D=0; D<=b[4]; D++){
23                     cj = A+B+B+C+C+C+D+D+D+D;
24                     if (A && dp[A-1][B][C][D]+a[cj]>dp[A][B][C][D])    dp[A][B][C][D] = dp[A-1][B][C][D]+a[cj];
25                     if (B && dp[A][B-1][C][D]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A][B-1][C][D]+a[cj];
26                     if (C && dp[A][B][C-1][D]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A][B][C-1][D]+a[cj];
27                     if (D && dp[A][B][C][D-1]+a[cj]>dp[A][B][C][D]) dp[A][B][C][D] = dp[A][B][C][D-1]+a[cj];
28                 }
29     printf("%d\n", dp[b[1]][b[2]][b[3]][b[4]]);
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 = 20000+10;
 6 const int MAXM = 100000+10;
 7
 8 int n, m, f[MAXN*2];
 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=0; 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 0;
31 }
32
33 int main(){
34     scanf("%d %d", &n, &m);
35     for (int i=1; i<=2*n; i++)
36         f[i] = i;
37     for (int i=0; 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

NOIP2010 题解

时间: 2024-11-06 07:18:45

NOIP2010 题解的相关文章

NOIP2010解题报告

NOIP2010题解 第一题:机器翻译 题意是有m个存储单元,每次在里面查找一个单词,如果没查到就要在词典里查,并将单词记录在存储单元内,但如果存储单词数超出了m,就必须将第一个单元内的单词删去,求查词典的次数. 水题,实际就是对队列的操作,稍微要注意的是,如果队列中已经插到了要找的单词,这个单词就不必再次插入队尾. 代码: program translate; var a:array[0..3000]of longint; n,i,m,j,x,t,h,ans,g:longint; begin

NOIP2010 引水入城 题解

http://www.rqnoj.cn/problem/601 今天发现最小区间覆盖竟然是贪心,不用DP!于是我又找到这题出来撸了一发. 要找到最上面每个城市分别能覆盖最下面哪些城市,如果最下面有城市怎么都覆盖不到,就输出覆盖不到的城市数. 这样,最上面的城市能覆盖的最下面的城市一定是一个区间,不会从中间断开.因为如果断开了,那断开的这一部分怎么都没有水能流到了,可以按照覆盖不到处理.当全部能覆盖到的时候,才要用这些区间来算最小需要多少个起点城市,有覆盖不到的就不用这些区间了.居然,好像说得很复

noip2010提高组题解

NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n的棋盘,每个格子对应一个分数,1,2,3,4的卡片共m张,给出四种卡片各自的数量,求改变出牌顺序能获得的最大分数. 思路:开了一个四维的f[i][j][k][l]来表示每张牌有了几张时的最大分数: F[i][j][k][l]=max(f[i-1][j][k][l],f[i][j-1][k][l],f

noip2010提高组3题题解 by rLq

本题地址http://www.luogu.org/problem/show?pid=1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多.如果两名怨气值为c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为c 的冲突事件. 每年年末,警察局会将本年内监狱中

NOIP2010 机器翻译 题解

描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译:如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译. 假设内存中有M个单元,每单元能存放一个单词和译义.每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过M-

[题解+总结]动态规划大合集II

1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2.lis 最长上升子序列 唯一一道裸题,但是O(n^2)过不了,临时看了看O(n log n)的二分做法和线段树做法.先来讲讲简单的二分做法,其本质就是在O(n^2)上进行优化,需要证明一个结论.设当前处理数列第k位,存在: (1)a[i]<a[j]<a[k]: (2)i<j<k: (3

NOIP 2010 题解

[前言]最近这的很少弄OI了,虽说是暑假.趁要把NOIP2010~2013的题刷完,我做完一份便写一篇题解吧. [P1774机器翻译] P1774机器翻译 Accepted 标签:[显示标签] 描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译:如果内存中没有,软件就会在外存中的词典内查找,查出单

NOIP 2010题解

唔..NOIP2010比较简单,总体感觉不错. Problem 1: 机器翻译 水题,队列的简单应用. 读入时判断是否在内存中,可以用hash优化.如果不在内存中push进内存,放不下了pop header不用说了.上代码(未hash优化) //Bazinga! #include "cstdio" int sum,i,m,n; struct Q{ int len,head,tail,qub[1001],i; void push(int n){ qub[tail]=n; ++tail;

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种