综合-某假期欢乐赛 (Apri, 2018)

假期欢乐赛,确实挺轻松的,被逼迫写了题解。

A.推数
按列观察,有的列有多个格子,看起来好复杂啊,先放一放。
按行观察,黑色格子在 i 行 j 列:
当 i 是奇数,对应数字第 i 位是 j-1
当 i 是偶数,对应数字第 i 位是 9-j

B.体重
某位同学不是中间体重的充要条件是,比他重的人数 >= mid 或 比他轻的人数 >= mid
x 比 y 重,则 x, y 有单向连通关系,G[x][y] = true 。比 y 重的人数就是满足 G[i][y] = true 的 i 的数量。
比 y 轻的人数类似。
用 Floyd 跑一遍,再统计一下就好啦。

C.采蘑菇
观察一下是一道动规,状态是这个:f[t][i] 时间 t 时在 i 位置能采摘的最大蘑菇数量。
f[t][i] = max(f[t-1][i-1], f[t-1][i], f[t-1][i+1]) + v[i]
注意边界条件,f[0][k] = 0,其它的 f[0][i] = -INF (1 <= i <= n, i != k)
答案是 f[n][i] (1 <= i <= n)。考虑到第一维每次只用到了上一次的值(f[t-1]...),可以加一个滚动数组。

D.摘桃子
每棵树都有桃子就是说,只要走过一条小路就可以获得 D 个桃子,这样权值就从 点 上变到了 边 上,考虑一下图论。
电动车线路等价于获得 D-V 个桃子。建图,求从 S 出发的最长路即可。
能够摘到无限桃子的情况就是图中存在“正权回路”的情况,即有某个点在 SPFA 过程中的入队次数 > 总点数。不知道是不是这么叫,就是 SPFA 里面的负权回路那种东西……

E.数列
初看像贪心,有点像最长公共子序列的样子……不过仔细想想,怎么可能?(其实是看数据2000觉得不对劲才换思路的,逃
是一道动规。用 f[i][j] 表示 X 数列前 i 个项要变成 Y 数列前 j 个项最少的操作次数。
当 X[i] = Y[j]
f[i][j] = f[i-1][j-1]
当 X[i] != Y[j]
f[i][j] = min(
f[i-1][j] + 1 (删去 X 的第 i 项)
f[i][j-1] + 1 (把 X 变成 Y 的前 j-1 项后在 X 末尾插入和 Y 的第 j 项相同的数)
f[i-1][j-1] + 1 (把 X 的第 i 项改为 Y 的第 j 项)
)
当 i 或 j 是 0 时,显然 f[i][j] = abs(i - j),即直接全部插入或全部删除。这道题也可以滚动一下优化空间。

 1 #include <stdio.h>
 2
 3 char A[15];
 4
 5 int main()
 6 {
 7     int i, j;
 8     for (i = 1; i <= 10; ++i) {
 9         scanf("%s", A);
10         for (j = 0; j < 10; ++j)
11             if (A[j] == ‘B‘) break;
12         printf("%d", i & 1 ? j : 9-j);
13     }
14     return 0;
15 }

A

 1 #include <stdio.h>
 2
 3 int G[150][150];
 4
 5 int main()
 6 {
 7     int N, M, i, j, k;
 8     bool flag = false;
 9     scanf("%d%d", &N, &M);
10     for (i = 1; i <= M; ++i) {
11         int t1, t2;
12         scanf("%d%d", &t1, &t2);
13         if (t1 != t2) G[t1][t2] = true;
14     }
15
16     for (k = 1; k <= N; ++k)
17         for (i = 1; i <= N; ++i)
18             for (j = 1; j <= N; ++j)
19                 if (!G[i][j] && G[i][k] && G[k][j]) G[i][j] = true;
20
21     for (i = 1; i <= N; ++i) {
22         int cnt1 = 0, cnt2 = 0;
23         for (j = 1; j <= N; ++j) {
24             if (G[j][i]) ++cnt1;
25             if (G[i][j]) ++cnt2;
26         }
27         if (cnt1 >= (N+1)/2 || cnt2 >= (N+1)/2) {
28             printf("%d ", i);
29             if (!flag) flag = true;
30         }
31     }
32     if (!flag) printf("0\n");
33     return 0;
34 }

B

 1 #include <stdio.h>
 2 #include <algorithm>
 3
 4 using namespace std;
 5
 6 const int INF = 1e9;
 7
 8 int f[1200][150];
 9
10 int main()
11 {
12     int N, T, K, ans = 0, i, t;
13     scanf("%d%d%d", &N, &T, &K);
14     for (i = 1; i <= N; ++i) f[0][i] = -INF;
15     f[0][K] = 0;
16     for (t = 1; t <= T; ++t) {
17         for (i = 1; i <= N; ++i) {
18             int val;
19             scanf("%d", &val);
20             f[t&1][i] = -INF;
21
22             if (i > 1) f[t&1][i] = max(f[t&1][i], f[t&1^1][i-1]);
23             if (i < N) f[t&1][i] = max(f[t&1][i], f[t&1^1][i+1]);
24             f[t&1][i] = max(f[t&1][i], f[t&1^1][i]);
25             f[t&1][i] += val;
26         }
27     }
28     for (i = 1; i <= N; ++i) ans = max(ans, f[T&1][i]);
29     printf("%d\n", ans);
30     return 0;
31 }

C

 1 #include <stdio.h>
 2 #include <queue>
 3 #include <vector>
 4
 5 typedef long long LL;
 6
 7 using namespace std;
 8
 9 const int _N = 1200;
10 const LL INF = 99999999999999LL;
11
12
13 LL n, m;
14 LL dis[_N], cnt[_N];
15 bool book[_N];
16 bool flag;
17
18 struct node {
19     LL v, w;
20     node(LL _v, LL _w):
21         v(_v), w(_w) { }
22 };
23
24 queue<LL> Q;
25 vector<node> G[_N];
26
27 void SPFA(LL beg)
28 {
29     LL i, p;
30     for (i = 1; i <= n; ++i)
31         dis[i] = INF, book[i] = false, cnt[i] = 0;
32     dis[beg] = 0, Q.push(beg), book[beg] = true, cnt[beg] = 1;
33     while (!Q.empty()) {
34         int p = Q.front();
35         Q.pop(), book[p] = false;
36         vector<node>::iterator it;
37         for (it = G[p].begin(); it != G[p].end(); ++it) {
38             if (dis[it->v] > dis[p] + it->w) {
39                 dis[it->v] = dis[p] + it->w;
40                 if (!book[it->v]) {
41                     Q.push(it->v), book[it->v] = true;
42                     if (++cnt[it->v] == n+1) { flag = true; break; }
43                 }
44             }
45         }
46         if (flag) break;
47     }
48     return ;
49 }
50
51 int main()
52 {
53     LL i, t1, t2, t3, d, t, s;
54     scanf("%lld%lld%lld%lld%lld", &d, &m, &n, &t, &s);
55     for (i = 1; i <= m; ++i) {
56         scanf("%lld%lld", &t1, &t2);
57         G[t1].push_back(node(t2, -d));
58     }
59     for (i = 1; i <= t; ++i) {
60         scanf("%lld%lld%lld", &t1, &t2, &t3);
61         G[t1].push_back(node(t2, t3-d));
62     }
63     SPFA(s);
64     if (flag) { printf("Poor boss he\n"); return 0; }
65     LL ans = INF;
66     for (i = 1; i <= n; ++i) ans = min(ans, dis[i]);
67     printf("%lld\n", d-ans);
68     return 0;
69 }

D

 1 #include <stdio.h>
 2 #include <algorithm>
 3
 4 using namespace std;
 5
 6
 7 int x[2300], y[2300], f[2][2300];
 8
 9 int main()
10 {
11     int n, m, i, j;
12     scanf("%d%d", &n, &m);
13     for (i = 1; i <= n; ++i) scanf("%d", &x[i]);
14     for (j = 1; j <= m; ++j) scanf("%d", &y[j]);
15     for (i = 0; i <= n; ++i)
16         for (j = 0; j <= m; ++j) {
17             if (!i || !j) { f[i&1][j] = abs(i - j); continue; }
18             if (x[i] == y[j]) {
19                 f[i&1][j] = f[i&1^1][j-1];
20             } else {
21                 f[i&1][j] = min(f[i&1^1][j-1], min(f[i&1^1][j], f[i&1][j-1])) + 1;
22             }
23         }
24     printf("%d\n", f[n&1][m]);
25     return 0;
26 }

E

题目 NKOJ 考试 118

A推数
时间限制 : 10000 MS   空间限制 : 65536 KB
问题描述

   何老板在玩一个推理游戏,但他遇到了一点麻烦,需要你帮忙!请根据A,B两幅图,推导出C图代表的数字!

输入格式

一个由大写字母‘B‘和‘W‘构成的10*10的矩阵,表示图C,
其中‘B‘表示黑色方块,‘W‘白色方块

输出格式

一行,一个数字,表示推导出的C代表的数字。

样例输入

BWWWWWWWWW
WWWWWWBWWW
WWWWBWWWWW
BWWWWWWWWW
WWWBWWWWWW
WWWWWWWWBW
WWWWBWWWWW
WWBWWWWWWW
WWWWWBWWWW
WWWWWWWBWW

样例输出

034931

B体重
时间限制 : 10000 MS   空间限制 : 65536 KB
问题描述

近日,信竞班有人在散布谣言,说何老板体重超重,这有损何老板在同学们心中的完美形象,让何老板很是头疼。何老板还了解到,散布该谣言的人号称自己拥有最合适的体重,体重值位于所有人的正中间,何老板决心找出这个家伙。

信竞班有n名同学,编号1到n,已知每名同学的体重都不相同。何老板想知道,哪个同学的体重位于正中间。也就是如果将n名同学按体重由轻到重排序后,该名同学位于第(n+1)/2名,这名同学一定是谣言散布者。

但是同学们都不肯准确告诉何老板他的体重,何老板只好在暗中收集信息。

例如:n=5时,何老板搜集到了如下信息:

1号同学比2号同学轻

3号同学比4号同学轻  

1号同学比5号同学轻  

2号同学比4号同学轻  

根据上面的情报,虽然何老板不能准确得出哪个同学具有中间体重,但他可以肯定4号和1号不可能具有中间体重,因为,1、2、3比4轻,而2、4、5比1重,所以他可以排除到这两名同学。

写一个程序统计出目前我们最多能排除掉多少个同学。也就是确定有多少个同学肯定不会是中间体重。

输入格式

第一行:两个整数n和m,其中n为奇数表示学生总数,m表示何老板搜集到的信息条数。

接下来的m行,每行两个整数x和y,表示x号同学比y号同学重。

输出格式

若干个整数,按从小到大的顺序输出不可能是中间重量的学生的编号。
若一个也找不出来,输出0。

样例输入 1

5 4
2 1
4 3
5 1
4 2

样例输出 1

1 4

样例输入 2

11 5
1 2
3 4
5 6
7 8
9 10

样例输出 2

0

样例输入 3

31 29
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 1
12 1
13 1
14 1
15 1
16 1
17 1
18 1
19 1
20 1
21 1
22 1
23 1
24 1
25 1
26 1
27 1
28 1
29 1
30 1

样例输出 3

1

提示

1<=n<=100

1<=m<=5000

C采蘑菇
时间限制 : 10000 MS   空间限制 : 65536 KB
问题描述

最近,何老板玩一款名叫“采蘑菇”的有趣手机游戏。
游戏地图由水平放置的n块砖(编号1到n)构成,每一秒钟,每块砖上会新长出一些蘑菇,蘑菇的生命时间只有1秒钟,1秒钟后蘑菇就消失了。游戏玩家操控的游戏角色“马里奥”一开始位于第k块砖上,每一秒钟,马里奥有三种移动方式可以选择:
1.原地不动,并采摘该砖上的蘑菇;
2.移动到左边一块砖,并采摘该砖上的蘑菇;
3.移动到右边一块砖,并采摘该砖上的蘑菇;
游戏一共持续t秒钟,问马里奥最多能采集到多少颗蘑菇。

输入格式

第一行,四个整数n,t,k,分别表示砖块的数量,游戏的持续时间和一开始马里奥所处的位置。
接下来一个t*n的整数矩阵,其中第i行描述第i秒钟的情况,第i行第j个数表示第i秒第j块砖上长出的蘑菇数。

输出格式

一行,一个整数,表示能够采摘到的最多蘑菇数。

样例输入

样例输入1:
4 3 2
3 1 1 1
2 1 1 1
1 5 4 1

样例输入2:
5 3 3
3 1 3 3 2 
5 6 5 1 6 
7 4 3 4 4

样例输入3:
6 4 2
3 7 1 3 1 5 
4 2 6 6 3 6 
2 2 2 4 7 7 
2 7 6 2 4 6

样例输出

样例输出1:
10

样例输出2:
16

样例输出3:
23

提示

对于30%的数据 1<=n<=10, 1<=t<=5;
对于100%的数据 1<=n<=100, 1<=t<=1000 ,1<=每块砖上长出的蘑菇数<=10000

样例1说明:
第一秒由2号砖移动到1号砖,采3颗蘑菇
第二秒呆在1号砖不动,采2颗蘑菇
第三秒由1号砖移动到2号砖,采5颗蘑菇

D摘桃子
时间限制 : - MS   空间限制 : 165536 KB 
评测说明 : 1s
问题描述

又到了桃子成熟的季节,何老板的果园推出了摘桃子的活动。
何老板的果园有N棵桃树,编号1到N。果园里有M条单向小路,将一些桃树连接起来,其中第i条小路连接Ai和Bi两棵桃树。何老板为了盈利,费劲心机做了以下规定:
1.顾客一开始从第S号桃树开始摘桃活动;
2.每棵桃树上有无限多个桃子,但是顾客一次在一棵桃树上最多只能摘D个桃子,然后他必须到其它桃树去摘桃。当然,顾客也可以在其他地方摘桃后又回到原来摘过桃的桃树,再摘D个桃子。而且这样往返摘桃的次数是没有限制的
3.为方便顾客摘桃,何老板还提供电动车服务,电动车总共有T条单向线路,每条线路连接两棵桃树,其中第i条电动车线路连接Xi和Yi两棵桃树,乘坐一次的需要支付给何老板Vi个桃子。如果顾客手中没有桃子,也可以乘坐电动车,用以后摘取得桃子来支付就行;
4.顾客可以选在在任何时刻,任何桃树处结束他的摘桃活动;

今天你来到何老板的果园,你想知道,最多可以摘到多少个桃子呢?如果可以摘到无限度个桃子,输出"Poor boss he"

输入格式

第一行,5个整数,分别是D,M,N,T,S
接下来M行,每行两个整数Ai和Bi,表示从Ai号桃树到第Bi号桃树有条单向小路
接下来T行,每行三个空格间隔的整数Xi,Yi,Vi,表示有一条从Xi号桃树到Yi号桃树的单向电动车线路,乘坐一次的花费为Vi个桃子

输出格式

一个整数,表示最多能摘到的桃子个数。
若个数无限,输出"Poor boss he"

样例输入 1

100 3 5 2 1
1 5
2 3
1 4
5 2 150
2 5 120

样例输出 1

250

样例输入 2

100 7 10 9 1
1 2
4 5
5 6
5 8
6 8
7 9
8 9
1 3 2
2 3 2
3 4 5
3 5 95
3 6 13
5 7 95
6 7 11
7 8 69
7 10 66

样例输出 2

813

提示

2 <= N <= 1000
1 <= M <= 1000
1 <= T <= 1000
1 <= D <= 1,000
1 <= Vi <= 50,000

E数列
时间限制 : 10000 MS   空间限制 : 65536 KB
问题描述

有X,Y两个整数数列,现在需要我们用最小的操作次数,将X数列转换成与Y相同的数列。
对于X数列,我们有以下三种操作:
1.删除一个数字;
2.插入一个数字;
3.将一个数字改为另一个数字;
请你计算出完成转换所需的最小操作数。

输入格式

第一行,两个整数n和m,分别代表X,Y两个数列的长度。
第二行,n个空格间隔的整数,表示X数列
第三行,m个空格间隔的整数,表示Y数列

输出格式

一行,一个整数,表示最少所需的操作数。

样例输入 1

7 5
1 2 3 4 5 6 7
8 2 3 8 7

样例输出 1

4

样例输入 2

8 7
1 8 2 7 6 1 2 6 
2 1 7 8 7 6 8

样例输出 2

6

样例输入 3

10 8
1 1 3 3 1 2 2 2 1 1 
1 1 3 3 2 1 3 3

样例输出 3

5

提示

1<=n,m<=2000, 0<=数列中的数字<=1000

样例1说明:
第一步:将数字1修改为8
8 2 3 4 5 6 7
8 2 3 8 7
第二步:将数字4删掉
8 2 3 5 6 7
8 2 3 8 7
第三步:将数字5删掉
8 2 3 6 7
8 2 3 8 7
第四部:将数字6修改为8
8 2 3 8 7
8 2 3 8 7

原文地址:https://www.cnblogs.com/ghcred/p/8724809.html

时间: 2024-10-05 14:45:10

综合-某假期欢乐赛 (Apri, 2018)的相关文章

欢乐赛解题报告

~~一场不欢乐的欢乐赛 时间分配::T1做的时候还可以,大约三十分钟写了个深搜(鬼知道我为啥不用广搜,大概是因为快半个月没写了)写完后去研究第二题,刚开始以为是贪心,很快写了出来,但是自己推了一会举出了反例.于是自己想了很多方法,但是都是基于贪心,写了一个多小时,写炸了,没办法又改成了贪心.第三题并不会,然后搜索大法过了一个点,(输出-1也是一个点) 整体感觉::还是太弱,T1是会的,但是还是没做对,大概是独立做题少的缘故吧,平常做题都没有思考太多时间.T2贪心T3暴力,貌似自己啥都不会.到现在

Comet OJ - 2019 六一欢乐赛

传送门 #A: 思路:等差数列求和,看成俩次1+2+…+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 int n; 8 while(cin >> n) 9 { 10 cout << n*(n+1) - n <

NOIP模拟 (8-2情人节欢乐赛) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目来自hzwer的模拟题 果实计数 (count.pas/.c/.cpp) 时间限制:1s,空间限制32MB 题目描述: 淘淘家有棵奇怪的苹果树,这棵树共有n+1层,标号为0~n.这棵树第0层只有一个节点,为根节点.已知这棵树为b叉树,且保证是一颗满b叉树. 现在,该树第n层的每个节点上都结出了一个苹果,淘淘想知道共结了多少苹果.由于数量可能很大,答案要求输出mod k后的结果. 输入描述: 给出第1层的节点数b和层数n和k

2017端午欢乐赛——Day1T3(树的直径+并查集)

//前些天的和jdfz的神犇们联考的模拟赛.那天上午大概是没睡醒吧,考场上忘了写输出-1的情况,白丢了25分真是**. 题目描述     小C所在的城市有 n 个供电站,m条电线.相连的供电站会形成一个供电群,那么为了节省材料,供电群是一棵树的形式,也即城市是一个森林的形式(树:V个点,V-1条边的无向连通图,森林:若干棵树).每个供电群中不需要所有供电站都工作,最少只需要一个工作,其余的就都会通过电线收到电,从而完成自己的供电任务.当然,这样会产生延迟.定义两个供电站的延迟为它们之间的电线数量

六一欢乐赛 考试总结

时间:2018年5月31日 8:00~11:00 题目:5 难度:普及+/提高- T1.T2略 T3: 题目: 此时,Conan 却在一旁玩着 2048. 这是一个 4*4 的矩阵,初始全为 0.每次一个没有数字的格子中会随机出现一个 2 或 4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢.相撞时会相加. Conan 想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去.所以这个模拟的任务就交给你了.过了一会,他然后睁开

南京网络赛题解 2018

J. Sum A square-free integer is an integer which is indivisible by any square number except 111. For example, 6=2⋅36 = 2 \cdot 36=2⋅3 is square-free, but 12=22⋅312 = 2^2 \cdot 312=22⋅3 is not, because 222^222 is a square number. Some integers could b

暑假爆零欢乐赛SRM08题解

这真的是披着CF外衣的OI赛制?我怎么觉得这是披着部分分外衣的CF?果然每逢cf赛制必掉rating,还是得%%%cyc橙名爷++rp.. A题就是找一找序列里有没有两个连在一起的0或1,并且不能向两端延伸(比如--1001--或110--或者--100),找到了之后就可以把整个序列分成这两个数左边,这两个数和他的右边三部分,然后这两个0或1每个都能与左边右边串在一起构成两个相同的子序列,并且这个子序列在原序列中只会出现这两次,满足题目条件.如果没找到,再看看原来的序列里是不是只有两个0或1,那

【20170311】白色情人节欢乐赛

我出的水题,因为是白色情人节前一天,所以题目背景.. 试题:/s/1pKKkCeJ         vyh3 (百度云) T1:chocolate 题意:给你n个妹子,每个妹子对你的初始好感度为c0[i],你不给她x块巧克力她的好感度会下降c1点,你给她y块巧克力她的好感度会上升c2点,现在问你,你有m块巧克力的情况下你可以获得的好感度之和最大是多少. 解题思路:显然是个01背包类型的DP.时间效率O(nm). 标程: #include<cstdio> #include<iostream

CH Round #56 - 国庆节欢乐赛解题报告

最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树,其中一些树上结有能够产生能量的魔力水果.已知每个水果的位置(Xi,Yi)以及它能提供的能量Ci.然而,魔幻森林在某些时候会发生变化:(1) 有两行树交换了位置.(2) 有两列树交换了位置.当然,树上结有的水果也跟随着树一起移动.不过,只有当两行(列)包含的魔力水果数都大于0,或者两行(列)都没有魔