Egyptian Collegiate Programming Contest 2017 (ACM ECPC 2017) - original tests edition
题目链接:https://codeforces.com/gym/101856
D. Dream Team
题意:n个点,让你连边成为一棵树,边权为顶点的GCD(u,v)。求所有边权和的最大值。
思路:将每个数进行因数分解,从大的因子开始求最大生成树。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + ;
vector<int> G[maxn];
int far[maxn];
int n;
int find(int x)
{
if(far[x] == x) return x;
else return far[x] = find(far[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if(x == y) return ;
far[x] = y;
}
bool check(int x, int y)
{
return find(x) == find(y);
}
void init()
{
for(int i = ;i < maxn;i++)
{
far[i] = i;
G[i].clear();
}
}
long long kruskal()
{
long long ans = ;
for(int i = 1e5;i >= ;i--)
{
if(G[i].size() < ) continue;
else{
int u = G[i][];
for(int j = ;j < G[i].size();j++)
{
int v = G[i][j];
if(!check(v, u)){
ans += i;
unite(v, u);
}
}
}
}
return ans;
}
void gao(int x, int k)
{
int nn = sqrt(x);
for(int i = ;i <= nn;i++)
{
if(x % i == ){
if(i * i == x){
G[i].push_back(k);
}
else {
G[i].push_back(k);
G[x/i].push_back(k);
}
}
}
}
int main()
{
freopen("dream.in","r",stdin);
int t;
scanf("%d",&t);
for(int cas = ; cas <= t;cas++)
{
init();
scanf("%d",&n);
int x;
for(int i = ;i < n;i++){
scanf("%d",&x);
gao(x,i);
}
long long ans = kruskal();
printf("Case %d: ",cas);
printf("%lld\n",ans);
}
return ;
}
F. Forgot the Flag!
题意:给你一个凸多边形,给你俩个点在多边形内,问你从a点到多边形一条边上再到b点的最小距离以及和边界的交点。
思路:对于多边形每条边求点b的对称点,答案就是a到对称点的距离,然后求直线交。注意特判俩点重合并且在线上的时候。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
const double eps = 1e-;
double INF = 1e18;
int sgn(double x)
{
if(fabs(x) < eps) return ;
else return x < ? - : ;
}
struct Point{
double x, y;
Point(){}
Point(double _x,double _y)
{
x = _x,y = _y;
}
void input()
{
scanf("%lf %lf",&x, &y);
}
bool operator ==(const Point &b)const{
return sgn(x - b.x) == && sgn(y - b.y) == ;
}
bool operator <(const Point &b)const{
return sgn(x - b.x) == ? sgn(y - b.y) < : x < b.x;
}
Point operator -(const Point &b)const{
return Point(x - b.x, y - b.y);
}
double operator ^(const Point &b)const{
return x*b.y-y*b.x;
}
double operator *(const Point &b)const{
return x*b.x + y*b.y;
}
double len2(){
return x*x + y*y;
}
double distance(Point p){
return hypot(x-p.x,y-p.y);
}
Point operator + (const Point &b)const{
return Point(x+b.x,y+b.y);
}
Point operator * (const double &k)const{
return Point(x*k,y*k);
}
Point operator / (const double &k)const{
return Point(x/k,y/k);
} };
Point p[maxn];
struct line{
Point s, e;
line(){}
line(Point _s, Point _e)
{
s = _s,e= _e;
}
Point lineprog(Point p)
{
return s +(((e - s) * ((e - s)*(p - s)))/((e - s).len2()));
}
Point symmetrypoint(Point p)
{
Point q = lineprog(p);
return Point(*q.x - p.x, *q.y - p.y);
}
Point crosspoint(line v)
{
double a1 = (v.e - v.s) ^ (s - v.s);
double a2 = (v.e - v.s) ^ (e - v.s);
return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));
}
int relation(Point p){
int c=sgn((p-s)^(e-s));
if(c<) return ;
else if(c>) return ;
else return ;
}
};
int main()
{
int t;
freopen("flags.in","r",stdin);
scanf("%d",&t);
for(int cnt = ;cnt <= t;cnt++)
{
int n;
scanf("%d",&n);
for(int i = ;i < n;i++) p[i].input();
int q;
Point st, ed;
line l ;
Point a;
scanf("%d",&q);
printf("Case %d:\n",cnt);
while(q--)
{
st.input();
ed.input();
double ans = INF;
double d;
Point anspoint;
for(int i = ;i < n;i++){
l = line(p[i],p[(i+)%n]);
a = l.symmetrypoint(ed);
d = st.distance(a);
if(l.relation(ed) == && st == ed)
{
ans = ;
anspoint = st;
break;
}
if(sgn(d - ans) < ){
ans = d;
line r = line(st, a);
anspoint = l.crosspoint(r);
}
}
printf("%.7f %.7f %.7f\n",ans,anspoint.x,anspoint.y);
}
}
return ;
}
.G. Glorious Stadium
思路:推公式。
#include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
int main()
{
int t;
freopen("glorious.in","r",stdin);
scanf("%d",&t);
for(int cas = ;cas <= t;cas++)
{
int n;
double r, k;
scanf("%d %lf %lf",&n, &r, &k);
printf("Case %d: ",cas);
double af = pi / k;
double c = /(cos(af)*cos(af));
double m = (1.0-pow(c,n))/(1.0-c);
double ans = (tan(af)*k - pi)*r*r*m;
printf("%.5f\n",ans);
}
return ;
}
J. Jacked Tickets
题意:将n个东西分成m份,每一种数量 i 对应 p[i] 的损失,问损失和最小多少。
思路:题目说p[i]满足凹函数的性质,那么可以贪心知道,对于每一份要尽可能的平均。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
ll a[maxn];
int main()
{
freopen("jacking.in","r",stdin);
int t;
scanf("%d",&t);
for(int cnt = ;cnt <= t;cnt++)
{
int n;
scanf("%d", &n);
for(int i = ;i <= n;i++)
{
scanf("%lld",&a[i]);
}
int q;
scanf("%d", &q);
ll x, y;
printf("Case %d:\n", cnt);
while(q--)
{
scanf("%lld %lld",&x, &y);
if(x < y){
printf("impossible\n");
}
else
{
ll num = x / y;
ll remain = x % y;
ll ans = a[num]*y - a[num]*remain;
ans += a[num + ]*remain;
printf("%lld\n",ans);
} }
}
return ;
}
K. Katryoshka
题意:给定a,b,c,由(2*a,b),(2*a,b,c),(a,b,c) 三种组成方法去构造一个模型,问最多构建几个模型。
#include<bits/stdc++.h>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
freopen("katryoshka.in","r",stdin);
int t;
cin >> t;
for(int cnt = ;cnt <= t; cnt++)
{
int a, b, c;
cin >> a >> b >> c;
int k = min(a, b);
k = min(k, c);
int ans = k;
a -= k;b -= k;c -= k;
ans += min(a / , c);
cout << "Case " << cnt << ": " << ans << endl;
}
return ;
}
L. Lazy ERCD
签到题。
#include<bits/stdc++.h>
using namespace std; int main(){
freopen("lazy.in","r",stdin);
int T;
cin >>T;
for(int co = ; co <= T; co++){
int x;
cin >>x;
cout <<"Case "<<co<<": "<<x-<<endl;
}
}
Egyptian Collegiate Programming Contest 2017 (ACM ECPC 2017) - original tests edition的更多相关文章
- ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)
A.Arcade Game(康拓展开) 题意: 给出一个每个数位都不同的数n,进行一场游戏.每次游戏将n个数的每个数位重组.如果重组后的数比原来的数大则继续游戏,否则算输.如果重组后的数是最大的数则算 ...
- ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015) G. It is all about wisdom (二分,单源最短路)
题意:有\(n\)个点,\(m\)条边,只有当你的智力值大于这条边的\(w\)才能走,问在花费不超过\(k\)的情况下,从\(1\)走到\(n\)的所需的最小智力值. 题解:这题比赛为什么没想出来呢? ...
- 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) 题解
题目链接:http://codeforces.com/gym/101147 2017/8/27日训练赛,题目情况9/11,Rank 4/79. A. The game of Osho 题意:定义一个子 ...
- Egyptian Collegiate Programming Contest (ECPC 2015)
题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...
- Gym100814B Gym100814F Gym100814I(异或) ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... Gym100814B 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把 ...
- 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16)
A.The game of Osho(sg函数+二项展开) 题意: 一共有G个子游戏,一个子游戏有Bi, Ni两个数字.两名玩家开始玩游戏,每名玩家从N中减去B的任意幂次的数,直到不能操作判定为输.问 ...
- Codeforces Gym100814 I.Salem-异或 (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
这个题就是二进制,找两个数相应的二进制相对应的位置上数不同的最多的个数.异或写就可以. 一开始还想麻烦了,找出来最大的偶数和最大的奇数,最小的偶数和最小的奇数,但是这样想考虑的不全.因为范围比较小,直 ...
- Codeforces Gym100814 F.Geometry (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
这个题真的是超级超级水啊,哈哈哈哈哈哈.不要被题面吓到,emnnn,就这样... 代码: 1 #include<iostream> 2 #include<cstring> 3 ...
- Codeforces Gym100814 B.Unlucky Teacher (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把标准答案推出来. 因为 ...
随机推荐
- bfs(最短路径)
http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submis ...
- tornado后台小框架
import tornado.ioloop import tornado.web """使用get方法提交过来数据就是用get方法,使用post执行post方法这个框架的 ...
- C#windows向窗体传递泛型类
修改窗体代码文件*.cs public partial class FormName<T> : Form partial说明此类还有一半在另外的cs文件中,正是系统替你写好的*.desig ...
- Git--04 Github使用
目录 Github使用 1.注册用户 2.配置ssh-key 3.创建项目 4.克隆项目到本地 5.推送新代码到github Github使用 Github顾名思义是一个Git版本库的托管服务,是目前 ...
- go语言从例子开始之Example30.通道遍历
在前面的例子中,我们讲过 for 和 range为基本的数据结构提供了迭代的功能.我们也可以使用这个语法来遍历从通道中取得的值 Example: package main import "f ...
- 《TED演讲的秘密》:TED组织者总结的演讲技巧集锦。三星推荐。
对演讲感兴趣的可以看看.对TED内容感兴趣的也可以翻翻,书中有不少作者认为演讲技巧比较经典(一般来说内容上也有特色)的TED演讲的二维码.三星推荐.http://t.cn/RvFStu7
- mysql 联合表查询从表即使有索引依然ALL的一个原因
那就是主表和从表的关联字段的编码方式不一样!!! 晕啊,折腾了半天才发现,可能是不知道啥时候mysql更改主体编码方式了,结果导致后来新建的表的关联字段和之前的主表的字段的编码方式不一样 改成一样的编 ...
- Go 迭代切片
迭代切片有两种方式: 1. 使用 for range 迭代切片 // 其长度和容量都是 4 个元素 slice := [], , , } // 迭代每一个元素,并显示其值 for index, v ...
- word里输入英文字母间距变宽,字体改变,怎么回事?
word里输入英文字母间距变宽,字体改变,怎么回事? 你有没有遇到下面这种情况,在word里输入英文,变的很奇怪,就像下面图中那样: 是不是很蛋疼?看起来很别扭. 那是因为输入法是全角状态 我们只要把 ...
- python 时间和时间段显示
两个包,最开始发现的是time包 import time print(time.time()) #显示当前时间戳 print(time.localtime(time.time())) #显示本地时间 ...