2018-2019 Всероссийская командная олимпиада школьников по программированию, интернет-тур + отборы регионов (ВКОШП 18, интернет-тур) Solution
A:
水。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INFLL = 0x3f3f3f3f3f3f3f3f; ll n, m, h, w; ll solve()
{
ll cnt = ;
ll tn = n, tm = m;
while(tn > h)
{
tn = (tn + ) >> ;
cnt++;
}
while(tm > w)
{
tm = (tm + ) >> ;
cnt++;
}
return cnt;
} int main()
{
while(~scanf("%lld %lld %lld %lld", &n, &m, &h, &w))
{
ll ans = INFLL;
ans = min(ans, solve());
swap(h, w);
ans = min(ans, solve());
printf("%lld\n", ans);
}
return ;
}
B:留坑。
C:
题意:有n道题目,总时间为T,对于每一道题目有完成的时间和可以得到的分数,做题策略为按照一定顺序做题,如果时间足够,那么就可以得到这道题的分数,安排一个顺序,使得得到的分数最少
思路:如果总时间<=T 那么直接输出所有分数
反之 ,考虑一定存在至少一道题目恰好不能被完成
枚举这道题目,考虑所有时间小于这道题目的所有题目都要被完成
对于每道题目,还需要枚举剩下的时间,使得它完不成
那么排序之后枚举,左边的题目都要做完,右边的做01背包
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 2010
#define pll pair <ll, ll>
#define INF 0x3f3f3f3f3f3f3f3f
int n, m;
pll a[N];
ll dp[N][N];
ll tot_time, tot_sco; int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
tot_time = , tot_sco = ;
for (int i = ; i <= n; ++i)
{
scanf("%lld%lld", &a[i].first, &a[i].second);
tot_time += a[i].first;
tot_sco += a[i].second;
}
if (tot_time <= m)
{
printf("%lld\n", tot_sco);
continue;
}
sort(a + , a + + n);
memset(dp, 0x3f, sizeof dp);
dp[n + ][] = ;
for (int i = n; i > ; --i)
{
for (int j = m; j >= a[i].first; --j)
dp[i][j] = min(dp[i][j], dp[i + ][j - a[i].first] + a[i].second);
for (int j = ; j <= m; ++j) dp[i][j] = min(dp[i][j], dp[i + ][j]);
}
ll step = , tot = , res = INF;
for (int i = ; i <= n; ++i)
{
ll tmp = INF;
for (int j = m - step; j + a[i].first + step > m && j >= ; --j) tmp = min(tmp, tot + dp[i + ][j]);
res = min(tmp, res);
step += a[i].first;
tot += a[i].second;
}
printf("%lld\n", res);
}
return ;
}
D:
题意:给出一棵树中每个点的度数,构造这一棵树
思路:将点按度数从大到小排序,每个点会有一个父亲,最多连出n - 1个点。
#include <bits/stdc++.h>
using namespace std; #define N 200010
#define pii pair <int, int>
int n, d[N], pos[N], fa[N]; bool cmp (int a, int b) { return d[a] > d[b]; } int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) scanf("%d", d + i), pos[i] = i;
sort(pos + , pos + + n, cmp);
for (int i = ; i <= n; ++i) --d[pos[i]];
int id = ;
for (int i = ; i <= n; ++i)
{
while (d[pos[i]]--)
fa[pos[++id]] = pos[i];
}
for (int i = ; i <= n; ++i) if (i != pos[])
printf("%d %d\n", fa[i], i);
}
return ;
}
E:
水。
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 1000010
char s[N]; int main()
{
while (scanf("%s", s + ) != EOF)
{
int cnt = ;
for (int i = , len = strlen(s + ); i <= len; ++i) cnt += (s[i] == 'A');
ll res = ;
for (ll i = ; ; ++i)
{
if (i * (i + ) / > cnt) break;
res = i;
}
printf("%lld\n", res);
}
return ;
}
F:留坑。
G:
题意:给出一个n 要构造一个长度为n的序列,满足题目要求
思路:
如果是奇数
那么存在 起始点3 有 $2 \cdot 5 \cdot 6 = 3 \cdot 4 \cdot 5$
#include <bits/stdc++.h>
using namespace std; int n; int main()
{
while (scanf("%d", &n) != EOF)
{
if (n == ) puts("NO");
else if (n & )
{
puts("YES");
puts("");
printf("-++");
for (int i = ; i <= n; ++i) printf("%c", "+-"[i & ]);
puts("");
}
else
{
puts("YES");
puts("");
for (int i = ; i <= n; ++i) printf("%c", "-+"[i & ]);
puts("");
}
}
return ;
}
H:
题意:给出0-9每个数字的个数,构造一个最大的数,使得任意连续三位连起来都是3的倍数。数字可以不用完
思路:先将所有数字模3
就是三种数字 0, 1, 2
再考虑 排列
显然 三个一组三个一组,三个中012至少出现一次,即012的全排列,一共6种,
再考虑 全放0, 1, 2 又是三种
再考虑 只有一位或者两位,可以任意摆放
一共十种情况,去掉前导0之后取最大即可。
#include <bits/stdc++.h>
using namespace std; #define N 100010
int cnt[], tmp_cnt[], cntt[], tmp_cntt[], tar[], Max[], tmp_Max[];
char ans[][N];
int pos; void g()
{
for (int i = ; i < ; ++i) tmp_cnt[i] = cnt[i];
for (int i = ; i < ; ++i)
{
tmp_cntt[i] = cntt[i];
tmp_Max[i] = Max[i];
}
} void f()
{
for (int i = ; i < ; ++i) cnt[i] = tmp_cnt[i];
for (int i = ; i < ; ++i)
{
cntt[i] = tmp_cntt[i];
Max[i] = tmp_Max[i];
}
} void solve(int ide, int *tar)
{
pos = ;
while ()
{
for (int i = ; i < ; ++i)
{
int id = tar[i];
if (!cntt[id])
return;
if (cnt[Max[id]] == )
{
Max[id] = -;
for (int i = ; i >= ; --i) if (i % == id && cnt[i])
{
Max[id] = i;
break;
}
if (Max[id] == -) return;
}
ans[ide][++pos] = Max[id] + '';
--cntt[id];
--cnt[Max[id]];
}
}
} void work(int id)
{
pos = ;
while (cntt[id])
{
if (!cnt[Max[id]])
{
Max[id] = -;
for (int i = ; i >= ; --i) if (i % == id && cnt[i])
{
Max[id] = i;
break;
}
if (Max[id] == -) return;
}
ans[id + ][++pos] = Max[id] + '';
--cnt[Max[id]];
--cntt[id];
}
} bool cmp(char *a, char *b)
{
int lena = strlen(a + ), lenb = strlen(b + );
if (lena != lenb) return lena < lenb;
for (int i = ; i <= lena; ++i) if (a[i] != b[i])
return a[i] < b[i];
return ;
} void cle(int id)
{
int len = strlen(ans[id] + );
pos = len + ;
for (int i = , len = strlen(ans[id] + ); i <= len; ++i) if (ans[id][i] != '')
{
pos = i;
break;
}
if (pos == len + )
{
ans[id][] = '';
ans[id][] = ;
}
else
{
for (int i = ; i + pos - <= len; ++i)
ans[id][i] = ans[id][i + pos - ];
ans[id][len - pos + ] = ;
}
} int main()
{
while (scanf("%d", cnt) != EOF)
{
memset(cntt, , sizeof cntt);
memset(Max, -, sizeof Max);
memset(ans, , sizeof ans);
for (int i = ; i <= ; ++i) scanf("%d", cnt + i);
for (int i = ; i < ; ++i) if (cnt[i])
{
cntt[i % ] += cnt[i];
Max[i % ] = i;
}
int res = ;
for (int i = ; i >= && res < ; --i) if (cnt[i])
{
res = res * + i;
if (res < && cnt[i] > )
res = res * + i;
}
g();
pos = ;
while (res)
{
ans[][++pos] = res % + '';
res /= ;
}
ans[][pos + ] = ;
reverse(ans[] + , ans[] + pos + );
tar[] = , tar[] = , tar[] = ;
int ide = ;
do
{
f();
solve(ide, tar); ans[ide][pos + ] = ;
++ide;
} while (next_permutation(tar, tar + ));
for (int i = ; i < ; ++i)
{
f(); pos = ; work(i);
ans[i + ][pos + ] = ;
}
for (int i = ; i < ; ++i) cle(i);
pos = ;
for (int i = ; i < ; ++i) if (cmp(ans[pos], ans[i]))
pos = i;
printf("%s\n", ans[pos] + );
}
return ;
}
I:
题意:阅读理解题。有一个类似游泳圈的东西,有四道大道路,内圈,外圈,上圈,下圈,每个国家有四个城市,四个城市分别属于四道大道路上,定义经过一个国家为至少经过一条该国家的道路,有从任意一个国家的内城市出发,经过所有城市的最短路径
思路:考虑两种走法,
一种是两个国家之间都走内圈,还有一种是间隔走,走一下内圈,走一下上圈,取Min
#include <bits/stdc++.h>
using namespace std; #define ll long long
const double PI = acos(-1.0);
ll r, R, n; int main()
{
while (scanf("%lld%lld%lld", &r, &R, &n) != EOF)
{
if (n == )
{
printf("%.15f\n", PI * r / );
continue;
}
double len1 = (R - r) * 2.0 * PI / n;
double len2 = R * 2.0 * PI / n;
double ans1 = ( * n - ) * PI * r / + (n - ) * len1;
double ans2 = n * PI * r / + (n / ) * len2 + ((n - ) / ) * len1;
printf("%.15f\n", min(ans1, ans2));
}
return ;
}
J:留坑。
k:留坑。
L:水。
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define N 1010
int n, k, x, cnt;
char s[];
ll Bit[]; ll f(char *s)
{
ll res = ;
for (int i = , len = strlen(s + ); i <= len; ++i)
res = res * + s[i] - '';
return res;
} int main()
{
Bit[] = ;
for (int i = ; i <= ; ++i) Bit[i] = Bit[i - ] * ;
while (scanf("%d", &n) != EOF)
{
cnt = ; ll Min = ;
for (int i = ; i <= n; ++i)
{
scanf("%s", s + );
cnt = max(cnt, (int)strlen(s + ));
Min = max(Min, f(s));
}
Min = max((ll)n, Min);
Min = max(Min, Bit[cnt]);
printf("%lld\n", Min);
for (int i = ; i <= cnt; ++i) putchar(''); putchar('\n');
}
return ;
}
2018-2019 Всероссийская командная олимпиада школьников по программированию, интернет-тур + отборы регионов (ВКОШП 18, интернет-тур) Solution的更多相关文章
- 20172328 2018—2019《Java软件结构与数据结构》第二周学习总结
20172328 2018-2019<Java软件结构与数据结构>第二周学习总结 概述 Generalization 本周学习了第三章集合概述--栈和第四章链式结构--栈.主要讨论了集合以 ...
- COCI 2018/2019 CONTEST #2 T4 Maja T5Sunčanje Solution
COCI 2018/2019 CONTEST #2 T4 T5 Solution abstract 花式暴力 #2 T5 Sunčanje 题意 按顺序给你1e5个长方形(左下角坐标&& ...
- 工具软件集合 Adobe AE PS Pr CC 2018 2019 破解教程
来源https://mp.weixin.qq.com/s/zeq1sTmaPsKt7Bsok0Ldrg(若链接失效,请关注软件安装管家公众号) 相关链接 Office 2019破解教程 Adobe 2 ...
- 2018 – 2019 年前端 JavaScript 面试题
JavaScript 基础问题 1.使以下代码正常运行: JavaScript 代码: const a = [1, 2, 3, 4, 5]; // Implement this a.multiply( ...
- COCI 2018/2019 CONTEST #2 Solution
Problem1 Preokret 第一题一定不是什么难题. 第一个问题在读入的时候判断当前时间是不是在1440及以前就行 第二个问题考虑离线处理,由于每个时刻只能最多发生1个事件那么就弄个桶记录每一 ...
- 2018 - 2019 CTU Open Contest H. Split Game 【SG函数】
H. Split Game time limit per test 1.0 s memory limit per test 256 MB input standard input output sta ...
- 2018 - 2019 CTU Open Contest E. Locker Room 【后缀数组】
任意门:http://codeforces.com/gym/101954/problem/E E. Locker Room time limit per test 2.0 s memory limit ...
- Kali升级2018&&2019
0X01修改更新源 vim /etc/apt/sources.list #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-f ...
- 2018——2019 20165239Exp9 Web安全基础
Exp9 Web安全基础 一:基础问题回答 (1)SQL注入攻击原理,如何防御 •原理:它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语 ...
随机推荐
- UE4射线的碰撞与绘制
http://blog.csdn.net/qq992817263/article/details/51800657 //起点 终点 FHitResult RayGetHitResult(FVector ...
- AssetBundle 在Android机子上进行读取 .
http://game.ceeger.com/Manual/StreamingAssets.html 我看到官方文档中说明:Note that bundles are not fully compat ...
- OpenGL超级宝典总结(二)2D/3D笛卡尔坐标、坐标裁剪、纹理坐标、MVP转换等概念
如果你想把图形渲染在正确的位置上,那么坐标的设置就很重要了.在OpenGL中,与坐标相关的主要有笛卡尔坐标.坐标裁剪.纹理坐标.MVP(Model View Projection)转换. 1.笛卡尔坐 ...
- Xcode 利用VVDocumenter 生成注释 通过设置 再生成注释文档
在写代码的时候,如果按照一定的规范在头文件里写上注释的话, 就可以利用Xcode的文档自动输出功能生成一份完整的HTML项目文档. 生成的格式和Apple Developer网站上的API文档几乎是一 ...
- 我觉得epoll和select最大的区别
最近在用epoll,网速资料很多,大家都说epoll和select的区别比较大,而且select要不停遍历所有的fd,效率要低,而且fd有限制. 但是我认为二者最大的区别在于 先看代码 while ( ...
- Minix2.0操作系统kernel文件分析
详细分析 MINIX消息机制的核心: mpx386.s start.c proc.c 保护模式分析: src/kernel/exception.c src/kernel/protect.c src/ ...
- 【BZOJ2661】[BeiJing wc2012]连连看 最大费用流
[BZOJ2661][BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给 ...
- 统计文件中单词的个数---Shell及python版
最近在看shell中有个题目为统计单词的个数,使用了awk功能,代码如下 #!/bin/bash ];then echo "Usage:basename $0 filename" ...
- vue 缓存的keepalive页面刷新数据
用到这个的业务场景是这样的: a页面点击新建列表按钮进入到新建的页面b,填写b页面并点击b页面确认添加按钮,把这些数据带到a页面,填充到列表(数组),可以添加多条, 点击这条的时候进入到编辑页面,确认 ...
- js获取元素的外链样式
一般给元素设置行内样式,如<div id="div1" style="width:500px;"></div>.如要获取它的样式,即可d ...