校内训练赛题解第三篇
校内训练赛题解
- 人气估值
- 解题思路
- 脑力训练计划 (模拟 + 字符串)
- 解题思路
- 大暑赛期(贪心 + 思维)
人气估值
题目描述
你是某动画制作公司的企划部长。如今动画制作公司制作的东西,已经不仅仅局限于动画本身。相关商品,例如登场人物的手办和人物歌曲CD等,也是重要的收益来源。这个收益能提高到什么程度,完全取决于作为企划部长的你。
这是理所当然的,但这些相关产品并不是随便推出就可以的。因为开发商品需要大量的时间和预算。即使要发售动画中登场人物的手办,也必须限定于销售额高、人气高的人物。
衡量角色人气度的手段之一,就是人气投票。到目前为止,你也策划了几场人气投票,看来观众已经逐渐对这个策划不满了。当务之急是建立其他衡量受欢迎程度的方法。
所以你提出了一个假设。一个角色的受欢迎程度,与其在动画正编中的登场时间的总和成正比。为了验证这个假设,你决定编写一个程序来统计每个角色的出场时间。
输入
输入由多个情况组成。每个情况以以下格式给出。
n
name0 m0 d0,0 … d0,m0-1
name1 m1 d1,0 … d1,m1-1
.
.
.
namen-1 mn-1 dn-1,0 … dn-1,mn-1-1
n表示角色的人数。name
i
表示角色的名字。
m
i
表示人物出现的时间次数。m
i
后面是m
i
个整数d
i,j
。
d
i,j
表示人物出现的时间。
输入的结尾由n=0的行给出
如果在某一时刻只有一个角色出现在屏幕上,则该角色可以获得n点。
在同一时间出现的角色每增加一个,在该时间出现的角色所获得的点数减少1。
如果有n个角色在同一时间出现,则n个角色分别加1分。
输入满足以下条件。
2≤n≤20
0≤m
i
≤30
0≤d
i,j
<30
第i个字符的d
i,j
都不一样。
name
i
只包含大写或小写字母,长度不超过10。(小于等于10)
输出
把点数最小的角色的点数和那个名字用一个空白隔开输出。
如果有多个角色的点数最小,名字按字典顺序选择最小的人。
解题思路
看清题目。。。。 这题思路很简单,我们用一个map数组记录一下每一个数字出现的次数。那么对于第i个人我们在计算第j天的时候就加上 n - cd[a[j]] + 1 即可
代码:
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> using namespace std; const int N = 110;int n ; struct node {string name;int a[N], cnt;int pot;bool operator < (const node &w)const {if (pot == w.pot)return name < w.name;return pot < w.pot;} };int main() {while (cin >> n, n) {map<int, int>cd;node p[N];for (int i = 1 ; i <= n ; ++i) {cin >> p[i].name >> p[i].cnt;for (int j = 0 ; j < p[i].cnt; ++j) {cin >> p[i].a[j];cd[p[i].a[j]]++;}}for (int i = 1 ; i <= n ; ++i) {int c = 0 ;for (int j = 0 ; j < p[i].cnt ; ++j) {int x = n - cd[p[i].a[j]];c += ++x;}p[i].pot = c;}sort(p + 1, p + 1 + n);cout << p[1].pot << ' ' << p[1].name << endl;}return 0; }脑力训练计划 (模拟 + 字符串)
题面
她很烦恼。成绩不好。虽然她勉强要求父母让自己上了全寄宿制学校,但她的才华却丝毫没有绽放。也许他本来就没有天赋,但这是她尽可能不愿意去想的可能。
于是,她依赖在网上找到的诡异脑力训练教材。训练教材上说,通过用手解决类似补充可能性问题的实例,计算力得到提高,进而逻辑性思考力、直觉力、想象力也变得丰富,社团活动也活跃起来,恋爱也顺利进行。这诱惑着她学习这个教材。
根据教材描述,必须对加法范式表示的逻辑表达式的各个变量进行适当分配,判断逻辑表达式的值是否可以为真。顺便提一下,一个以上的变量(或者,其否定)的逻辑积称为从句(clause),只有几个从句的逻辑和表示的逻辑表达式遵循加法标准形式。一般说到补充可能性问题,逻辑表达式用乘法标准形来表示,但要注意,训练计划是加法标准形态。
她想研究一下训练计划的问题集,然后突然改变了主意。与其花钱买一本习题,不如请一个擅长编程的好朋友吃一顿冻糕,让他生成训练计划问题,并编写一个解决问题的程序。这样岂不是就可以得到很多问题和答案了吗。就这样,作为她最好的朋友,请你写一个解决训练计划的程序。
输入
输入由多个数据组成。每个情况以以下格式给出。
表达式字符串
输入的结尾由“#”组成的行给出
表达式遵循以下规则:
::= “(”")" | “(”")|("")"
::= “&”"&"
::= | “~”
::= [a-z]|[A-z]
(在这里,字符串文本用双引号括了起来。实际输入不包含双引号。)
此外,输入中没有多余的空格。
注意,从句由三个字面量组成。
表达式的长度不得超过500个字符。
测试用例的数量不超过1100个。
输出
如果存在使给定表达式的值为真的变量分配,则输出yes,否则输出no。
解题思路
代码:
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> using namespace std; const int N = 1e4 + 10; char st[N]; // 记录子表达式中同一个字符的第一个前字符int main() {char ch, pre = ' ' ;bool flag = false, key = true;int c = 0;map<char, int>cnt; // 统计字符出现的次数while (cin >> ch, pre != '#') {if (pre == ')' && ch != '|') {if (c)cout << "yes" << endl;elsecout << "no" << endl;cnt.clear();c = 0;}if (isalpha(ch)) {if (cnt.count(ch) && (pre == '~' && st[ch] != '~') || (pre != '~' && st[ch] == '~')) {key = false;} else if (cnt.count(ch) == 0)cnt[ch]++, st[ch] = pre;}if (ch == ')') {if (key)c ++;key = true;memset(st, 0, sizeof st);cnt.clear();}pre = ch;}return 0; }大暑赛期(贪心 + 思维)
题目描述
目前,人们的娱乐仅限于编程竞赛。教练一直在征集试题,这些试题分为|Math|Greedy|Geometry|DP|Graph|Other|六类。
好在收集到了很多问题,教练就想多开几场比赛。比赛由三道题组成,为了让比赛更具教育意义,教练决定举办以下四种比赛。
1、数学竞赛:Math试题和DP试题共3道题
2、算法游戏大赛:Greedy题和Graph题共3道题
3、实现游戏竞赛:Geometry问题和Other问题共3道题
4、均衡竞赛:一套三道题:1道来自Math或DP,1道来自Greedy或Graph,1道来自Geometry或Other
当然,在某项比赛中出题的题目是不能在其他比赛中出题的。教练的愿望是举办尽可能多的比赛。我们知道6类试题的数量,那么,最多能开几次竞赛呢?
输入
输入由多个情况组成。每个情况以以下格式给出。
n
Math
n
Greedy
n
Geometry
n
DP
n
Graph
n
Other
各输入值表示各类型问题的库存数量。
当输为0 0 0 0 0 0时,表示样例数据结束。
每个值满足以下条件
n
Math
+n
Greedy
+n
Geometry
+n
DP
+n
Graph
+n
Other
≤10
8
此外,测试用例的数量不超过20,000个。
输出
在一行中输出可能的最大竞赛数。
解题思路:
代码:
#include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int N = 1e6 + 10; LL a[7];int main() {while (cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4] >> a[5], a[0] || a[4] || a[1] || a[2] || a[3] || a[5] ) {LL res = 0;LL n1 = a[0] + a[3], n2 = a[1] + a[4], n3 = a[2] + a[5];LL minx = min(n1, min(n2, n3));if ((n1 % 3 == 0 && (n2 % 3 ) <= 1 && n3 % 3 == 0) || (n2 % 3 == 0 && (n1 % 3 ) && n3 % 3 == 0) || (n1 % 3 == 0&& (n3 % 3 ) <= 1 && n2 % 3 == 0) ) {res += n1 / 3 + n2 / 3 + n3 / 3;n1 %= 3, n2 %= 3, n3 %= 3;while (n1 && n2 && n3) {res ++ ;n1 --, n2--, n3--;}} else {bool flag = true;if (minx == 0)flag = false;res += minx;n1 -= minx, n2 -= minx, n3 -= minx;res += n1 / 3 + n2 / 3 + n3 / 3;n1 %= 3, n2 %= 3, n3 %= 3;if (flag && ((n1 == 2 && n2 == 2) || (n1 == 2 && n3 == 2) || (n2 == 2 && n3 == 2)))res ++;}cout << res << endl;}return 0; }总结
以上是生活随笔为你收集整理的校内训练赛题解第三篇的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 动态规划之状态机模型
- 下一篇: 算法之基础数论应用篇(一)