A

实际上我们for一遍就好。

坑点就是会爆int

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5+7;
  4. long long ans1,ans2,a[maxn],b[maxn],c[maxn];
  5. int n;
  6. int main(){
  7. while(cin>>n){
  8. ans1 = -1;
  9. for(int i=1;i<=n;i++){
  10. cin>>a[i]>>b[i]>>c[i];
  11. if(a[i]*b[i]*c[i]>ans1){
  12. ans1 = a[i]*b[i]*c[i];
  13. ans2 = i;
  14. }
  15. }
  16. cout<<ans2<<endl;
  17. }
  18. }

B . 两数组找相同的元素

我们对于B的每一个元素,在A中进行二分判断是否存在即可。

也可以使用C++内带的.find函数

  1. #include <cstdio>
  2. #include <unordered_set>
  3. #include <vector>
  4. using namespace std;
  5. int main(int argc, const char *argv[])
  6. {
  7. unordered_set<int> first_array;
  8. int m, n;
  9. scanf("%d %d", &m, &n);
  10. int tmp;
  11. for (int i = 0; i < m; i++) {
  12. scanf("%d", &tmp);
  13. first_array.emplace(tmp);
  14. }
  15. vector<int> ans;
  16. for (int i = 0; i < n; i++) {
  17. scanf("%d", &tmp);
  18. if (first_array.find(tmp) != first_array.end()) {
  19. ans.push_back(tmp);
  20. }
  21. }
  22. for (int i = 0; i < ans.size(); ++i) {
  23. printf("%d%c", ans[i], i + 1 == ans.size() ? '\n' : ' ');
  24. }
  25. return 0;
  26. }

B . DAU统计

实际上我们对于每一个元素,如果这个元素之前并没有出现过,那么对答案的贡献就加一。

于是我们可以用hash每次O(1)的判断这个元素之前是否出现过即可。

也可以使用set去维护也可以。

  1. // Copyright 2017 He Tianyi <hetianyi@bytedance.com>
  2. // Compiler opts: g++ -g -std=c++11 -o dau -O2 -Wall -Werror dau.cc
  3. #include <cstdint>
  4. #include <iostream>
  5. #include <vector>
  6. #include <set>
  7. #include <algorithm>
  8. #include <memory>
  9. static const size_t kMergeThreshold = 170000;
  10. class UserMap {
  11. public:
  12. UserMap() {
  13. base_ = std::unique_ptr<std::vector<uint64_t>>(
  14. new std::vector<uint64_t>());
  15. }
  16. void Merge() {
  17. std::vector<uint64_t> *result = new std::vector<uint64_t>();
  18. result->reserve(base_->size() + delta_.size());
  19. auto base_it = base_->begin();
  20. auto delta_it = delta_.begin();
  21. while (base_it != base_->end() || delta_it != delta_.end()) {
  22. if (delta_it == delta_.end()) {
  23. result->emplace_back(*base_it);
  24. base_it++;
  25. } else if (base_it == base_->end()) {
  26. result->emplace_back(*delta_it);
  27. delta_it++;
  28. } else {
  29. if (*base_it < *delta_it) {
  30. result->emplace_back(*base_it);
  31. base_it++;
  32. } else {
  33. result->emplace_back(*delta_it);
  34. delta_it++;
  35. }
  36. }
  37. }
  38. base_.reset(result);
  39. delta_.clear();
  40. }
  41. bool PutIfAbsent(uint64_t uid) {
  42. if (delta_.find(uid) != delta_.end()) {
  43. return false;
  44. }
  45. if (std::binary_search(base_->begin(), base_->end(), uid)) {
  46. return false;
  47. }
  48. delta_.insert(uid);
  49. if (delta_.size() > kMergeThreshold) {
  50. Merge();
  51. }
  52. return true;
  53. }
  54. private:
  55. std::unique_ptr<std::vector<uint64_t>> base_;
  56. std::set<uint64_t> delta_;
  57. };
  58. int main(int argc, char** argv) {
  59. uint64_t uid;
  60. UserMap m;
  61. uint32_t result = 0;
  62. do {
  63. std::cin >> uid;
  64. if (uid > 0 && m.PutIfAbsent(uid)) {
  65. result++;
  66. }
  67. } while (uid != 0);
  68. std::cout << result << std::endl;
  69. return 0;
  70. }

D . 形式化计算

题面分为两个部分,计算部分和输出部分。

计算部分比较简单,我们对于每个符号进行判断即可。

计算部分结束之后,我们要处理输出。

输出我们需要对每个数字/符号单独输出。可以观察到,每个字符实际上都是一个矩阵,所以我们可以预处理出每个字符矩阵的样子,然后输出即可。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. int a,b;
  6. char s[10];
  7. char drawBoard[5][200];
  8. void print1(int &startCol) {
  9. drawBoard[0][startCol] = '*';
  10. drawBoard[1][startCol] = '*';
  11. drawBoard[2][startCol] = '*';
  12. drawBoard[3][startCol] = '*';
  13. drawBoard[4][startCol] = '*';
  14. startCol = startCol + 3;
  15. }
  16. void print2(int &startCol) {
  17. drawBoard[0][startCol] = '*';
  18. drawBoard[0][startCol+1] = '*';
  19. drawBoard[0][startCol+2] = '*';
  20. drawBoard[1][startCol+2] = '*';
  21. drawBoard[2][startCol+2] = '*';
  22. drawBoard[2][startCol+1] = '*';
  23. drawBoard[2][startCol] = '*';
  24. drawBoard[3][startCol] = '*';
  25. drawBoard[4][startCol] = '*';
  26. drawBoard[4][startCol+1] = '*';
  27. drawBoard[4][startCol+2] = '*';
  28. startCol = startCol + 5;
  29. }
  30. void print3(int &startCol) {
  31. drawBoard[0][startCol] = '*';
  32. drawBoard[0][startCol+1] = '*';
  33. drawBoard[0][startCol+2] = '*';
  34. drawBoard[1][startCol+2] = '*';
  35. drawBoard[2][startCol] = '*';
  36. drawBoard[2][startCol+1] = '*';
  37. drawBoard[2][startCol+2] = '*';
  38. drawBoard[3][startCol+2] = '*';
  39. drawBoard[4][startCol] = '*';
  40. drawBoard[4][startCol+1] = '*';
  41. drawBoard[4][startCol+2] = '*';
  42. startCol = startCol + 5;
  43. }
  44. void print4(int &startCol) {
  45. drawBoard[0][startCol] = '*';
  46. drawBoard[0][startCol+2] = '*';
  47. drawBoard[1][startCol] = '*';
  48. drawBoard[1][startCol+2] = '*';
  49. drawBoard[2][startCol] = '*';
  50. drawBoard[2][startCol+1] = '*';
  51. drawBoard[2][startCol+2] = '*';
  52. drawBoard[3][startCol+2] = '*';
  53. drawBoard[4][startCol+2] = '*';
  54. startCol = startCol + 5;
  55. }
  56. void print5(int &startCol) {
  57. drawBoard[0][startCol] = '*';
  58. drawBoard[0][startCol+1] = '*';
  59. drawBoard[0][startCol+2] = '*';
  60. drawBoard[1][startCol] = '*';
  61. drawBoard[2][startCol] = '*';
  62. drawBoard[2][startCol+1] = '*';
  63. drawBoard[2][startCol+2] = '*';
  64. drawBoard[3][startCol+2] = '*';
  65. drawBoard[4][startCol+2] = '*';
  66. drawBoard[4][startCol+1] = '*';
  67. drawBoard[4][startCol] = '*';
  68. startCol = startCol + 5;
  69. }
  70. void print6(int &startCol) {
  71. drawBoard[0][startCol] = '*';
  72. drawBoard[0][startCol+1] = '*';
  73. drawBoard[0][startCol+2] = '*';
  74. drawBoard[1][startCol] = '*';
  75. drawBoard[2][startCol] = '*';
  76. drawBoard[2][startCol+1] = '*';
  77. drawBoard[2][startCol+2] = '*';
  78. drawBoard[3][startCol] = '*';
  79. drawBoard[3][startCol+2] = '*';
  80. drawBoard[4][startCol] = '*';
  81. drawBoard[4][startCol+1] = '*';
  82. drawBoard[4][startCol+2] = '*';
  83. startCol = startCol + 5;
  84. }
  85. void print7(int &startCol) {
  86. drawBoard[0][startCol] = '*';
  87. drawBoard[0][startCol+1] = '*';
  88. drawBoard[0][startCol+2] = '*';
  89. drawBoard[1][startCol+2] = '*';
  90. drawBoard[2][startCol+2] = '*';
  91. drawBoard[3][startCol+2] = '*';
  92. drawBoard[4][startCol+2] = '*';
  93. startCol = startCol + 5;
  94. }
  95. void print8(int &startCol) {
  96. drawBoard[0][startCol] = '*';
  97. drawBoard[0][startCol+1] = '*';
  98. drawBoard[0][startCol+2] = '*';
  99. drawBoard[1][startCol] = '*';
  100. drawBoard[1][startCol+2] = '*';
  101. drawBoard[2][startCol] = '*';
  102. drawBoard[2][startCol+1] = '*';
  103. drawBoard[2][startCol+2] = '*';
  104. drawBoard[3][startCol] = '*';
  105. drawBoard[3][startCol+2] = '*';
  106. drawBoard[4][startCol] = '*';
  107. drawBoard[4][startCol+1] = '*';
  108. drawBoard[4][startCol+2] = '*';
  109. startCol = startCol + 5;
  110. }
  111. void print9(int &startCol) {
  112. drawBoard[0][startCol] = '*';
  113. drawBoard[0][startCol+1] = '*';
  114. drawBoard[0][startCol+2] = '*';
  115. drawBoard[1][startCol] = '*';
  116. drawBoard[1][startCol+2] = '*';
  117. drawBoard[2][startCol] = '*';
  118. drawBoard[2][startCol+1] = '*';
  119. drawBoard[2][startCol+2] = '*';
  120. drawBoard[3][startCol+2] = '*';
  121. drawBoard[4][startCol] = '*';
  122. drawBoard[4][startCol+1] = '*';
  123. drawBoard[4][startCol+2] = '*';
  124. startCol = startCol + 5;
  125. }
  126. void print0(int &startCol) {
  127. drawBoard[0][startCol] = '*';
  128. drawBoard[0][startCol+1] = '*';
  129. drawBoard[0][startCol+2] = '*';
  130. drawBoard[1][startCol] = '*';
  131. drawBoard[1][startCol+2] = '*';
  132. drawBoard[2][startCol] = '*';
  133. drawBoard[2][startCol+2] = '*';
  134. drawBoard[3][startCol] = '*';
  135. drawBoard[3][startCol+2] = '*';
  136. drawBoard[4][startCol] = '*';
  137. drawBoard[4][startCol+1] = '*';
  138. drawBoard[4][startCol+2] = '*';
  139. startCol = startCol + 5;
  140. }
  141. void printjia(int &startCol) {
  142. drawBoard[1][startCol+1] = '*';
  143. drawBoard[2][startCol] = '*';
  144. drawBoard[2][startCol+1] = '*';
  145. drawBoard[2][startCol+2] = '*';
  146. drawBoard[3][startCol+1] = '*';
  147. startCol = startCol + 5;
  148. }
  149. void printjian(int &startCol) {
  150. drawBoard[2][startCol] = '*';
  151. drawBoard[2][startCol+1] = '*';
  152. drawBoard[2][startCol+2] = '*';
  153. startCol = startCol + 5;
  154. }
  155. void printcheng(int &startCol) {
  156. drawBoard[1][startCol] = '*';
  157. drawBoard[1][startCol+2] = '*';
  158. drawBoard[2][startCol+1] = '*';
  159. drawBoard[3][startCol] = '*';
  160. drawBoard[3][startCol+2] = '*';
  161. startCol = startCol + 5;
  162. }
  163. void printchu(int &startCol) {
  164. drawBoard[1][startCol+2] = '*';
  165. drawBoard[2][startCol+1] = '*';
  166. drawBoard[3][startCol] = '*';
  167. startCol = startCol + 5;
  168. }
  169. void printequal(int &startCol) {
  170. drawBoard[1][startCol] = '*';
  171. drawBoard[1][startCol+1] = '*';
  172. drawBoard[1][startCol+2] = '*';
  173. drawBoard[1][startCol+3] = '*';
  174. drawBoard[3][startCol] = '*';
  175. drawBoard[3][startCol+1] = '*';
  176. drawBoard[3][startCol+2] = '*';
  177. drawBoard[3][startCol+3] = '*';
  178. startCol = startCol + 6;
  179. }
  180. void printdian(int &startCol) {
  181. drawBoard[3][startCol] = '*';
  182. drawBoard[3][startCol+1] = '*';
  183. drawBoard[4][startCol] = '*';
  184. drawBoard[4][startCol+1] = '*';
  185. startCol = startCol + 4;
  186. }
  187. void drawNum(double x,int &startCol) {
  188. char s[100];
  189. memset(s,0,sizeof(s));
  190. if (x-int(x) == 0) sprintf(s,"%d",int(x));
  191. else if (x*10-int(x*10)==0) sprintf(s,"%.1lf",x);
  192. else sprintf(s,"%.2lf",x);
  193. for (int i=0;i<strlen(s);++i) {
  194. switch (s[i]) {
  195. case '0':print0(startCol);break;
  196. case '1':print1(startCol);break;
  197. case '2':print2(startCol);break;
  198. case '3':print3(startCol);break;
  199. case '4':print4(startCol);break;
  200. case '5':print5(startCol);break;
  201. case '6':print6(startCol);break;
  202. case '7':print7(startCol);break;
  203. case '8':print8(startCol);break;
  204. case '9':print9(startCol);break;
  205. case '.':printdian(startCol);break;
  206. case '-':printjian(startCol);break;
  207. }
  208. }
  209. }
  210. int main() {
  211. scanf("%d %s %d",&a,s,&b);
  212. for (int i=0;i<5;++i)
  213. for (int j=0;j<200;++j)
  214. drawBoard[i][j] = ' ';
  215. double c=0;
  216. int startCol=0;
  217. drawNum(a,startCol);
  218. switch (s[0]) {
  219. case '+':c = a+b; printjia(startCol);break;
  220. case '-':c = a-b; printjian(startCol);break;
  221. case '*':c = a*b; printcheng(startCol);break;
  222. case '/':c = 1.0*a/b; printchu(startCol);break;
  223. }
  224. drawNum(b,startCol);
  225. printequal(startCol);
  226. drawNum(c,startCol);
  227. for (int i=0;i<5;++i,cout<<endl)
  228. for (int j=0;j<startCol;++j)
  229. cout<<drawBoard[i][j];
  230. return 0;
  231. }

E . 任务执行策略

动态规划题。

首先把三角形翻转一下,倒着来考虑每个元素。

dp[i][j][k]表示考虑到第(i,j)个,当前选取了k个元素的最大值。

前缀和维护最大值,就可以把转移优化到O(1)。

  1. #include <algorithm>
  2. #include <cassert>
  3. #include <cstring>
  4. #include <cstdio>
  5. const int N = 60;
  6. const int M = 500 + 10;
  7. int dp[N][N][M], sum[N][N], a[N][N], n, m;
  8. int main() {
  9. assert(scanf("%d%d", &n, &m) == 2);
  10. assert(1 <= n && n <= 50);
  11. assert(1 <= m && m <= 500);
  12. for (int i = 1; i <= n; ++ i) {
  13. for (int j = 1; j <= i; ++ j) {
  14. assert(scanf("%d", &a[i][j]) == 1);
  15. assert(0 <= a[i][j] && a[i][j] <= 1000);
  16. }
  17. }
  18. for (int i = 1; i <= n; ++ i) {
  19. for (int j = 1; j <= i; ++ j) {
  20. sum[i][j] = sum[i][j - 1] + a[n - j + 1][i - j + 1];
  21. }
  22. }
  23. memset(dp, 200, sizeof(dp));
  24. for (int i = 0; i <= n; ++ i) {
  25. dp[i][0][0] = 0;
  26. }
  27. for (int i = 1; i <= n; ++ i) {
  28. for (int j = i; j >= 0; -- j) {
  29. for (int k = j; k <= m; ++ k) {
  30. dp[i][j][k] = std::max(dp[i][j + 1][k],
  31. dp[i - 1][std::max(0, j - 1)][k - j] + sum[i][j]);
  32. }
  33. }
  34. }
  35. printf("%d\n", dp[n][0][m]);
  36. return 0;
  37. }

喵哈哈村的魔法考试 Round 16 (Div.2) 比赛题解的更多相关文章

  1. 喵哈哈村的魔法考试 Round #7 (Div.2) 题解

    喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...

  2. 喵哈哈村的魔法考试 Round #2 (Div.2) 题解

    喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...

  3. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解

    喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...

  4. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  5. 喵哈哈村的魔法考试 Round #19 (Div.2) 题解

    题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...

  6. 喵哈哈村的魔法考试 Round #1 (Div.2)

    比赛地址:http://qscoj.cn/contest/2/ 都是中文题,这里不在详述题意 A.喵哈哈村的魔法石 分析:暴力求解 #include<iostream> #include& ...

  7. 喵哈哈村的魔法考试 Round #1 (Div.2) ABCD

    官方题解: http://www.cnblogs.com/qscqesze/p/6418555.html#3623453 喵哈哈村的魔法石 描述 传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石 ...

  8. 喵哈哈村的魔法考试 Round #4 (Div.2) 题解

    有任何疑问,可以加我QQ:475517977进行讨论. A 喵哈哈村的嘟嘟熊魔法(1) 题解 这道题我们只要倒着来做就可以了,因为交换杯子是可逆的,我们倒着去模拟一遍就好了. 有个函数叫做swap(a ...

  9. 喵哈哈村的魔法考试 Round #20 (Div.2) 题解

    题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...

随机推荐

  1. 利用navcat为mysql数据库单独的表赋权限及表结构同步

    为mysql数据库单独的表赋权限 场景:考勤系统需要拿OA数据库td_oa中的flow_run和flow_run_data表中的数据做考勤计算 考勤系统只需要读取这两张表的数据,所以只需要开通一个单独 ...

  2. python 运行日志logging代替方案

    以下是自己写的 记录日志的代码.(和logging不搭嘎,如果如要学loggging模块,本文末尾有他人的链接.) # prtlog.py ############################## ...

  3. JVM内存管理概述

    1.概述 java不在需要开发人员显示的分配内存和回收内存,而是由JVM自动管理内存的分配和回收(又称为垃圾回收-GC),这简化了编程难度,但同时可能使得程序员在不知不觉中浪费了很多内存,导致JVM花 ...

  4. PHP实现获取文件后缀名的几种常用方法

    方法1: function get_file_type($filename){ $type = substr($filename, strrpos($filename, ".")+ ...

  5. HTTP协议特点

    1 HTTP协议特点      1)客户端->服务端(请求request)有三部份         a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请 ...

  6. Ext.js中自己扩展的EasyGrid

    这里只写了一些核心的代码,具体如下: Ext.ux.EasyGrid = Ext.extend(Ext.grid.GridPanel, { initComponent: function () { t ...

  7. 【动态规划】Part1

    1. 硬币找零 题目描述:假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. 分析:   dp [0] = 0           dp [1] = 1 + ...

  8. 【C++ Primer 第11章 练习答案】2. 关联容器操作

    11.3.1节练习 [练习11.16]代码 map<int, int> m; auto iter = m.begin(); iter ->second = ;

  9. PTA之求单链表结点的阶乘和

    本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int ...

  10. [九省联考2018]一双木棋chess

    题解: 水题吧 首先很显然的是状压或者搜索 考虑一下能不能状压吧 这个东西一定是长成三角形的样子的 所以是可以状压的 相邻两位之间有几个0代表他们差几 这样最多会有2n 然后就可以转移了 由于之前对博 ...