喵哈哈村的魔法考试 Round 16 (Div.2) 比赛题解
A
实际上我们for一遍就好。
坑点就是会爆int
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
long long ans1,ans2,a[maxn],b[maxn],c[maxn];
int n;
int main(){
while(cin>>n){
ans1 = -1;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
if(a[i]*b[i]*c[i]>ans1){
ans1 = a[i]*b[i]*c[i];
ans2 = i;
}
}
cout<<ans2<<endl;
}
}
B . 两数组找相同的元素
我们对于B的每一个元素,在A中进行二分判断是否存在即可。
也可以使用C++内带的.find函数
#include <cstdio>
#include <unordered_set>
#include <vector>
using namespace std;
int main(int argc, const char *argv[])
{
unordered_set<int> first_array;
int m, n;
scanf("%d %d", &m, &n);
int tmp;
for (int i = 0; i < m; i++) {
scanf("%d", &tmp);
first_array.emplace(tmp);
}
vector<int> ans;
for (int i = 0; i < n; i++) {
scanf("%d", &tmp);
if (first_array.find(tmp) != first_array.end()) {
ans.push_back(tmp);
}
}
for (int i = 0; i < ans.size(); ++i) {
printf("%d%c", ans[i], i + 1 == ans.size() ? '\n' : ' ');
}
return 0;
}
B . DAU统计
实际上我们对于每一个元素,如果这个元素之前并没有出现过,那么对答案的贡献就加一。
于是我们可以用hash每次O(1)的判断这个元素之前是否出现过即可。
也可以使用set去维护也可以。
// Copyright 2017 He Tianyi <hetianyi@bytedance.com>
// Compiler opts: g++ -g -std=c++11 -o dau -O2 -Wall -Werror dau.cc
#include <cstdint>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <memory>
static const size_t kMergeThreshold = 170000;
class UserMap {
public:
UserMap() {
base_ = std::unique_ptr<std::vector<uint64_t>>(
new std::vector<uint64_t>());
}
void Merge() {
std::vector<uint64_t> *result = new std::vector<uint64_t>();
result->reserve(base_->size() + delta_.size());
auto base_it = base_->begin();
auto delta_it = delta_.begin();
while (base_it != base_->end() || delta_it != delta_.end()) {
if (delta_it == delta_.end()) {
result->emplace_back(*base_it);
base_it++;
} else if (base_it == base_->end()) {
result->emplace_back(*delta_it);
delta_it++;
} else {
if (*base_it < *delta_it) {
result->emplace_back(*base_it);
base_it++;
} else {
result->emplace_back(*delta_it);
delta_it++;
}
}
}
base_.reset(result);
delta_.clear();
}
bool PutIfAbsent(uint64_t uid) {
if (delta_.find(uid) != delta_.end()) {
return false;
}
if (std::binary_search(base_->begin(), base_->end(), uid)) {
return false;
}
delta_.insert(uid);
if (delta_.size() > kMergeThreshold) {
Merge();
}
return true;
}
private:
std::unique_ptr<std::vector<uint64_t>> base_;
std::set<uint64_t> delta_;
};
int main(int argc, char** argv) {
uint64_t uid;
UserMap m;
uint32_t result = 0;
do {
std::cin >> uid;
if (uid > 0 && m.PutIfAbsent(uid)) {
result++;
}
} while (uid != 0);
std::cout << result << std::endl;
return 0;
}
D . 形式化计算
题面分为两个部分,计算部分和输出部分。
计算部分比较简单,我们对于每个符号进行判断即可。
计算部分结束之后,我们要处理输出。
输出我们需要对每个数字/符号单独输出。可以观察到,每个字符实际上都是一个矩阵,所以我们可以预处理出每个字符矩阵的样子,然后输出即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int a,b;
char s[10];
char drawBoard[5][200];
void print1(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[1][startCol] = '*';
drawBoard[2][startCol] = '*';
drawBoard[3][startCol] = '*';
drawBoard[4][startCol] = '*';
startCol = startCol + 3;
}
void print2(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol] = '*';
drawBoard[3][startCol] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print3(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print4(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print5(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol+2] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol] = '*';
startCol = startCol + 5;
}
void print6(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print7(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print8(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print9(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void print0(int &startCol) {
drawBoard[0][startCol] = '*';
drawBoard[0][startCol+1] = '*';
drawBoard[0][startCol+2] = '*';
drawBoard[1][startCol] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
drawBoard[4][startCol+2] = '*';
startCol = startCol + 5;
}
void printjia(int &startCol) {
drawBoard[1][startCol+1] = '*';
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
drawBoard[3][startCol+1] = '*';
startCol = startCol + 5;
}
void printjian(int &startCol) {
drawBoard[2][startCol] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[2][startCol+2] = '*';
startCol = startCol + 5;
}
void printcheng(int &startCol) {
drawBoard[1][startCol] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[3][startCol] = '*';
drawBoard[3][startCol+2] = '*';
startCol = startCol + 5;
}
void printchu(int &startCol) {
drawBoard[1][startCol+2] = '*';
drawBoard[2][startCol+1] = '*';
drawBoard[3][startCol] = '*';
startCol = startCol + 5;
}
void printequal(int &startCol) {
drawBoard[1][startCol] = '*';
drawBoard[1][startCol+1] = '*';
drawBoard[1][startCol+2] = '*';
drawBoard[1][startCol+3] = '*';
drawBoard[3][startCol] = '*';
drawBoard[3][startCol+1] = '*';
drawBoard[3][startCol+2] = '*';
drawBoard[3][startCol+3] = '*';
startCol = startCol + 6;
}
void printdian(int &startCol) {
drawBoard[3][startCol] = '*';
drawBoard[3][startCol+1] = '*';
drawBoard[4][startCol] = '*';
drawBoard[4][startCol+1] = '*';
startCol = startCol + 4;
}
void drawNum(double x,int &startCol) {
char s[100];
memset(s,0,sizeof(s));
if (x-int(x) == 0) sprintf(s,"%d",int(x));
else if (x*10-int(x*10)==0) sprintf(s,"%.1lf",x);
else sprintf(s,"%.2lf",x);
for (int i=0;i<strlen(s);++i) {
switch (s[i]) {
case '0':print0(startCol);break;
case '1':print1(startCol);break;
case '2':print2(startCol);break;
case '3':print3(startCol);break;
case '4':print4(startCol);break;
case '5':print5(startCol);break;
case '6':print6(startCol);break;
case '7':print7(startCol);break;
case '8':print8(startCol);break;
case '9':print9(startCol);break;
case '.':printdian(startCol);break;
case '-':printjian(startCol);break;
}
}
}
int main() {
scanf("%d %s %d",&a,s,&b);
for (int i=0;i<5;++i)
for (int j=0;j<200;++j)
drawBoard[i][j] = ' ';
double c=0;
int startCol=0;
drawNum(a,startCol);
switch (s[0]) {
case '+':c = a+b; printjia(startCol);break;
case '-':c = a-b; printjian(startCol);break;
case '*':c = a*b; printcheng(startCol);break;
case '/':c = 1.0*a/b; printchu(startCol);break;
}
drawNum(b,startCol);
printequal(startCol);
drawNum(c,startCol);
for (int i=0;i<5;++i,cout<<endl)
for (int j=0;j<startCol;++j)
cout<<drawBoard[i][j];
return 0;
}
E . 任务执行策略
动态规划题。
首先把三角形翻转一下,倒着来考虑每个元素。
dp[i][j][k]表示考虑到第(i,j)个,当前选取了k个元素的最大值。
前缀和维护最大值,就可以把转移优化到O(1)。
#include <algorithm>
#include <cassert>
#include <cstring>
#include <cstdio>
const int N = 60;
const int M = 500 + 10;
int dp[N][N][M], sum[N][N], a[N][N], n, m;
int main() {
assert(scanf("%d%d", &n, &m) == 2);
assert(1 <= n && n <= 50);
assert(1 <= m && m <= 500);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= i; ++ j) {
assert(scanf("%d", &a[i][j]) == 1);
assert(0 <= a[i][j] && a[i][j] <= 1000);
}
}
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= i; ++ j) {
sum[i][j] = sum[i][j - 1] + a[n - j + 1][i - j + 1];
}
}
memset(dp, 200, sizeof(dp));
for (int i = 0; i <= n; ++ i) {
dp[i][0][0] = 0;
}
for (int i = 1; i <= n; ++ i) {
for (int j = i; j >= 0; -- j) {
for (int k = j; k <= m; ++ k) {
dp[i][j][k] = std::max(dp[i][j + 1][k],
dp[i - 1][std::max(0, j - 1)][k - j] + sum[i][j]);
}
}
}
printf("%d\n", dp[n][0][m]);
return 0;
}
喵哈哈村的魔法考试 Round 16 (Div.2) 比赛题解的更多相关文章
- 喵哈哈村的魔法考试 Round #7 (Div.2) 题解
喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...
- 喵哈哈村的魔法考试 Round #2 (Div.2) 题解
喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解
喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05 最后更新: 2017年2月21日 20:06 时间限制: 1000ms 内存限制: 128M 描述 传说喵哈哈村有三种神 ...
- 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...
- 喵哈哈村的魔法考试 Round #1 (Div.2)
比赛地址:http://qscoj.cn/contest/2/ 都是中文题,这里不在详述题意 A.喵哈哈村的魔法石 分析:暴力求解 #include<iostream> #include& ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) ABCD
官方题解: http://www.cnblogs.com/qscqesze/p/6418555.html#3623453 喵哈哈村的魔法石 描述 传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石 ...
- 喵哈哈村的魔法考试 Round #4 (Div.2) 题解
有任何疑问,可以加我QQ:475517977进行讨论. A 喵哈哈村的嘟嘟熊魔法(1) 题解 这道题我们只要倒着来做就可以了,因为交换杯子是可逆的,我们倒着去模拟一遍就好了. 有个函数叫做swap(a ...
- 喵哈哈村的魔法考试 Round #20 (Div.2) 题解
题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...
随机推荐
- 出现“error LNK1169: 找到一个或多个多重定义的符号”的原因
或许,有人真的会这样写程序吧...所以才会碰到如下哥们提出的问题. https://zhidao.baidu.com/question/131426210.html 出现这种问题的原因链接中的最佳答案 ...
- nodejs前端开发环境安装
1. nodejs安装 要求:node版本6.2.0及以上,npm版本3.8.9及以上 Nodejs安装包地址: 2. 在rTools上下载并安装git 3. 在rTools上 ...
- 20175225 《Arrays和String单元测试》
---恢复内容开始--- 题目 在IDEA中以TDD的方式对String类和Arrays类进行学习,测试相关方法的正常,错误和边界情况 - String类 - charAt - split - Arr ...
- C#面向对象(封装)
以上就是面向对象的封装和初始化:
- python的开发环境配置-Eclipse-PyDev插件安装
安装PyDev插件的两种安装方法: 1.百度搜索PyDev 2.4.0.zip,下载后解压,得到Plugins和Feature文件夹,复制两文件夹到Eclipse目录,覆盖即可. 插件的版本要对应py ...
- 并行(多进程)-python
1.进程创建 2.当前进程信息 使用current_process可获得当前进程的信息: (1)引入:from multiprocessing import current_process (2)获取 ...
- 性能测试九:jmeter进阶之beanshell的使用+断言
一.使用 BeanShell使用方式一 BeanShell面板上写脚本 // 从vars中获取用户定义的参数,并转换为int类型 int p_skuId = Integer.parseInt(vars ...
- python+selenium十二:一个输入框双层input标签
先点击第一个,再对第二个进行操作,否则操作失败 driver.find_element_by_css_selector(".pwd").click()driver.find_ele ...
- JavaScript常见的假值
值 说明 var a=false; 值等于false(假) var a =0; 值等于0 var a=''; 空的字符串 var a=10/'abc' NaN var a; 未赋值变量
- MyEclipse中把JSP默认编码改为UTF-8
在MyEclispe中创建Jsp页面,Jsp页面的默认编码是“ISO-8859-1”,如下图所示: 在这种编码下编写中文是没有办法保存Jsp页面的,会出现如下的错误提示: 因此可以设置Jsp默认的编码 ...