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语 ...
随机推荐
- python2.0_s12_day14_jQuery详解
jquery的中文介绍文档:http://www.php100.com/manual/jquery/jQuery之基本选择器jQuery中提供的用于获取标签的方法都有哪些? jQuery提供的 &qu ...
- IOS视频播放器的制作
利用自带MPMoviePlayerController来实现视频播放,首先要在项目中导入MediaPlayer.Framework框架包. 在视图控制器中 #import "MediaPla ...
- web基础----->servlet中得到请求的数据
对tomcat的源码做一些分析,今天我们就开始servlet中的请求分析. form表单中的默认类型 一.在index.jsp中get请求: <form action="Paramet ...
- Java三方---->pdf框架之IText的使用
在企业的信息系统中,报表处理一直占比较重要的作用t.通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题.今天 ...
- vue-学习笔记(更新中...)
vue学习笔记 2017-08-23 11:10:28 Vue实例: var vm = new Vue({ // 选项 }) 实例化Vue.Vue实例,构造函数Vue.创建一个Vue的根实例,Vue ...
- 配置maven使用nexus
本文简单介绍使用配置maven使用nexus仓库,在团队中使用nexus,避免每个人都从中央仓库去下载依赖,节省带宽,提高下载速度,同时也减少了中央仓库的压力 配置在maven中使用nexus很简单( ...
- PL/SQL developer 可以连接本地数据库,但是不可以连接远程数据库的解决方法
修改Oracle_home目录下的 network\ADMIN\tnsnames.ora 文件, 在其中增加远程数据库对应的记录,类似下边这样: .2_orcl = (DESCRIPTION = (A ...
- java 中的String类型数据添加双引号
转义符 \ 加上引号 \" <?xml version="1.0"encoding="GBK"?> String temp = &qu ...
- java的bean和map互转的工具类
import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;i ...
- 【css预处理器】------sass的基本语法------【巷子】
001.安装sass 1.删除gem源:gem sources --remove https://rubygems.org/ 2.添加国内源:gem sources -a http://gems.ru ...