PetrozavodskWinterTraining2015

A - Three Servers

题目描述:有\(n\)个数,将这\(n\)个数分成\(3\)堆,使得\(3\)堆中和的最大值减最小值最小,求方案。

solution

\(f[i][j]\)表示第二堆减第一堆等于\(i\),第三堆减第二堆等于\(j\)的方案。由于数字比较小,所以可以定\(-100 \leq i, j \leq 100\),然后将读入数据随机排序,做\(10\)次就可以过了。

时间复杂度:\(O(能过)\)

F - Empty Vessels

题目描述:有\(n\)个水杯,每个水杯的容量为\(a_i\),现在有\(3\)种操作:

  1. 将某个水杯装满水
  2. 将某个水杯里的水倒掉
  3. 将某个水杯里的水倒到另一个水杯里,直到一个水杯满或一个水杯空

    给定一个值\(m\),问是否通过若干次操作之后某个水杯里的水体积为\(m\),求出方案。

solution

显然,\(m\)一定要是\(a_i\)的最大公约数的倍数,并且\(m\)要小于\(a_i\)的最大值。

然后将最大的水杯看做剩余系,所有水杯往最大的水杯倒水,相当于水量模最大水杯容量,然后像完全背包那样做即可。

时间复杂度:\(O(最大容量*n)\)

G - Maximum Product

solution

#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn=30; LL A, B;
int a[maxn], b[maxn], now[maxn]; void calc(LL num, int *a)
{
if (num==0) a[a[0]=1]=0;
a[0]=0;
while (num)
{
a[++a[0]]=num%10;
num/=10;
}
}
bool check()
{
if (now[0]!=a[0]) return now[0]>a[0];
for (int i=now[0]; i; --i)
if (now[i]!=a[i]) return now[i]>a[i];
return true;
}
void solve()
{
scanf("%lld%lld", &A, &B);
calc(A, a);
calc(B, b); LL answer=1, ans=B;
for (int i=1; i<=b[0]; ++i) answer*=b[i]; for (int i=b[0]; i; --i)
{
for (int j=b[0]; j>i; --j) now[j]=b[j];
now[i]=b[i]-1;
for (int j=i-1; j; --j) now[j]=9;
for (int j=i; j<b[0]; ++j)
if (now[j]<0)
{
now[j]+=10;
now[j+1]--;
}
else break;
now[0]=b[0];
if (now[0]>1 && now[now[0]]==0) --now[0];
if (check())
{
LL s=1;
for (int j=1; j<=now[0]; ++j) s*=now[j];
if (s>answer)
{
answer=s;
ans=0;
for (int j=now[0]; j; --j) ans=ans*10+now[j];
}
}
}
printf("%lld\n", ans);
}
int main()
{
solve();
return 0;
}

H - Biathlon 2.0

题目描述:分别给定\(n, m\)个向量,对于\(n\)里面的每个向量,在\(m\)中找一个向量,使得两个向量的点乘最小。

solution

根据点乘的意义,相当于是一个向量在另一个向量的投影,因此可以想到只有\(m\)个向量形成的下凸壳,在下凸壳上的点才是答案,将\(n\)个向量极角排序,然后每个向量对应的答案在下凸壳上是单调的。

时间复杂度:\(O(nlogn)\)

I - Archaeological Research

题目描述:有一个未知序列\(a_i\),给出一些数据,第\(i\)行第\(j\)个数据表示某个数在序列的第\(i+1\)个数后面(包括\(i+1\))第一次出现的位置是\(j\),找出\(a_i\)的可行解中字典序最小的一个。

solution

题目还可以用另一种方式表达:第\(i\)行第\(j\)个数据表示某个数在序列的第\(i+1\)位到第\(j-1\)位没出现过,进而可以求出\(a_i\)在\([l_i, i-1]\)没出现过,然后只要贪心地从左到右放数,每次取\([1, l_i-1]\)中最小的数,如果\(l_i=1\),那么新开一个数字给\(a_i\)。

时间复杂度:\(O(nlogn)\)

J - Sockets

题目描述:有一个电源(只有一个插座),\(n\)个排插,分别有\(a_i\)个插座,每个排插可以直接接电源或者插到别的排插上,有\(m\)部手机需要同时充电,每部手机规定到电源之间最多能有\(b_i\)个排插,问最多能有多少部手机同时充电。

solution

将排插按\(a_i\)从大到小排序,手机按\(b_i\)从小到大排序,二分答案,先满足\(b_i\)较小的,其它位置插排插。

时间复杂度:\(O(nlogn)\)

#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn=int(2e5)+100; int n, m;
int a[maxn], b[maxn]; void read()
{
scanf("%d%d", &n, &m);
for (int i=1; i<=n; ++i) scanf("%d", &a[i]);
for (int i=1; i<=m; ++i) scanf("%d", &b[i]);
}
bool check(int num)
{
LL rest=1;
for (int i=1, level=0; i<=n && num; ++level)
{
int k=num;
while (k && b[k]==level) --k;
if (num-k>rest) return false;
LL tmp=(rest-=(num-k));
num=k;
while (i<=n && (tmp--)) rest+=a[i++]-1;
}
return rest>=num;
}
void solve()
{
sort(a+1, a+1+n, greater<int>());
sort(b+1, b+1+m, greater<int>()); int L=0, R=m+1;
while (L+1<R)
{
int mid=(L+R)>>1;
if (check(mid)) L=mid;
else R=mid;
}
printf("%d\n", L);
}
int main()
{
read();
solve();
return 0;
}

K - Toll Roads

题目描述:给定一棵树,边权为\(1\),现在可以选择一条长度不超过\(m\)的链,将链上的边权全改为\(0\),使得树的直径最小,求方案。

solution

思路挺好想的,就是枚举一端作为树根,然后类似树形\(dp\)算出当另一端某个点时,树的直径是多少。

时间复杂度:\(O(n^2)\)

#include <bits/stdc++.h>
using namespace std; const int maxn=5010; int n, m, root;
vector<int> out[maxn];
int idx[maxn];
pair<int, int> le[maxn], ri[maxn];
int radle[maxn], radri[maxn];
int fa[maxn], f[maxn], g[maxn], h[maxn];
int rad[maxn], deep[maxn];
pair<int, int> ans, solu; void read()
{
scanf("%d%d", &n, &m);
for (int i=0; i<n; ++i) out[i].clear();
for (int i=1; i<n; ++i)
{
int u, v;
scanf("%d%d", &u, &v);
out[u].push_back(v);
out[v].push_back(u);
}
}
void dfs1(int cur, int _fa)
{
rad[cur]=0;
f[cur]=0;
fa[cur]=_fa;
if (_fa==-1) deep[cur]=0;
else deep[cur]=deep[_fa]+1;
for (auto &to:out[cur])
if (to!=_fa)
{
dfs1(to, cur);
rad[cur]=max(rad[cur], max(rad[to], f[cur]+f[to]+1));
f[cur]=max(f[cur], f[to]+1);
}
}
void dfs2(int cur, int past, int chain)
{
if (deep[cur]>m) return;
int s=max(past, max(rad[cur], chain+f[cur]));
if (make_pair(s, deep[cur])<ans)
{
ans=make_pair(s, deep[cur]);
solu=make_pair(root, cur);
}
int cnt=0;
for (auto &to:out[cur])
if (to!=fa[cur]) idx[++cnt]=to;
le[1]=make_pair(0, 0);
radle[1]=0;
for (int i=2; i<=cnt; ++i)
{
le[i]=le[i-1];
radle[i]=max(radle[i-1], rad[idx[i-1]]);
if (f[idx[i-1]]+1>le[i].first)
{
le[i].second=le[i].first;
le[i].first=f[idx[i-1]]+1;
}
else le[i].second=max(le[i].second, f[idx[i-1]]+1);
}
ri[cnt]=make_pair(0, 0);
radri[cnt]=0;
for (int i=cnt-1; i>0; --i)
{
ri[i]=ri[i+1];
radri[i]=max(radri[i+1], rad[idx[i+1]]);
if (f[idx[i+1]]+1>ri[i].first)
{
ri[i].second=ri[i].first;
ri[i].first=f[idx[i+1]]+1;
}
else ri[i].second=max(ri[i].second, f[idx[i+1]]+1);
}
for (int i=1; i<=cnt; ++i)
{
g[idx[i]]=max(le[i].first, ri[i].first);
h[idx[i]]=max(le[i].first+ri[i].first, max(le[i].first+le[i].second, ri[i].first+ri[i].second));
h[idx[i]]=max(h[idx[i]], max(radle[i], radri[i]));
}
for (auto &to:out[cur])
if (to!=fa[cur]) dfs2(to, max(past, max(h[to], chain+g[to])), max(chain, g[to]));
}
void solve()
{
ans=make_pair(n*2, 0);
for (int i=0; i<n; ++i)
{
root=i;
dfs1(i, -1);
dfs2(i, 0, 0);
}
printf("%d\n%d\n", ans.first, ans.second);
if (ans.second) printf("%d %d\n", solu.first, solu.second);
}
int main()
{
read();
solve();
return 0;
}

Petrozavodsk WinterTraining 2015的更多相关文章

  1. 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】

    2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...

  2. 【推导】【构造】Petrozavodsk Summer Training Camp 2015 Day 2: Xudyh (TooSimple) Contest, Saturday, August 22, 2015 Problem G. Travelling Salesman Problem

    一个矩阵,每个位置有一个非负整数,一个人从左上走到右下,不能走重复的格子,问得到的最大权值. 当长宽不都为偶数时,必然能走遍所有格子,横着从左到右,从右到左(或是竖着走)走完即可. 当长宽都是偶数时, ...

  3. 2015 西雅图微软总部MVP峰会记录

    2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...

  4. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

  5. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  6. TFS 2015 敏捷开发实践 – 看板的使用

    看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...

  7. Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决

    PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...

  8. 一年之计在于春,2015开篇:PDF.NET SOD Ver 5.1完全开源

    前言: 自从我2014年下半年到现在的某电商公司工作后,工作太忙,一直没有写过一篇博客,甚至连14年股票市场的牛市都错过了,现在马上要过年了,而今天又是立春节气,如果再不动手,那么明年这个无春的年,也 ...

  9. .NET开源进行时:消除误解、努力前行(本文首发于《程序员》2015第10A期的原始版本)

    2014年11月12日,ASP.NET之父.微软云计算与企业级产品工程部执行副总裁Scott Guthrie,在Connect全球开发者在线会议上宣布,微软将开源全部.NET核心运行时,并将.NET ...

随机推荐

  1. wc 统计程序

    WC项目要求 这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数.单词数和行数.给实现一个统计程序,它能正确统计程序文件的字符数.单词数.行数,以 ...

  2. sublime text3 增加emmett插件

    本内容基于Windows环境)一.已安装有Sublime Text3 二.安装Package Control    安装这个后,可以在线安装所需的插件    方法1.Ctrl+~打开控制台,在控制台输 ...

  3. [转帖] Kubernetes如何使用ReplicationController、Replica Set、Deployment管理Pod ----文章很好 但是还没具体操作实践 也还没记住.

    Kubernetes如何使用ReplicationController.Replica Set.Deployment管理Pod https://blog.csdn.net/yjk13703623757 ...

  4. 李建20181029课时整理(NOIP考点)

    历年真题 数学题: 数论(exgcd 逆元,CRT,EXCRT,快速幂,线性筛 ,杜教筛)排列组合 概率期望(什么东西) C(n,m) = 逆元? 分解质因数? Ti(大质数的类似物)思考技巧分解质因 ...

  5. 洛谷 P1309 瑞士轮 解题报告

    P1309 瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低 ...

  6. oracle:delete和truncate

    oracle中清空表数据的两种方法 1.delete from t 2 .truncate table t 区别: 1.delete是dml操作:truncate是ddl操作,ddl隐式提交不能回滚 ...

  7. Python序列化与反序列化-json与pickle

    Python序列化与反序列化-json与pickle 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.json的序列化方式与反序列化方式 1>.json序列化 #!/usr ...

  8. OpenStack中RabbitMQ高可用性配置

    采用镜像队列的方案进行配置 1. 网络拓扑 node1:10.10.11.1 node2:10.10.11.2 2. 配置hosts node1+node2: vim /etc/hosts >1 ...

  9. Java中多个异常的捕获顺序(多个catch)

    import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...

  10. python学习笔记7-excel操作

    一.操作excel import xlwt book = xlwt.Workbook() #新建一个excel sheet = book.add_sheet('sheet1') #添加一个sheet页 ...