2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

本文详细介绍了2017-2018 ACM-ICPC德国大学生程序设计竞赛(GCPC 2017)的题目及解决方案。包括Drawing Borders、Buildings、Joyride等10个问题,涉及图论、最短路径、计算几何等多个算法领域。
摘要由CSDN通过智能技术生成

2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

  • A.Drawing Borders
  • B.Buildings
  • C.Joyride
  • D.Pants On Fire
  • E.Perpetuum Mobile
  • F.Plug It In!
  • G.Water Testing
  • H.Ratatoskr
  • I.Uberwatch
  • J.Word Clock
  • K.You Are Fired

A.Drawing Borders

题意: 给定m个点,每个点给出(x,y),每个点都有一个颜色1/2/3,-3000<=x,y<=3000,找到划分方法将这些点划分为3个平面,打印你划分出来的2个平面的边界。
题解:
由于点都是整数,因此可以用如下的划分方法:
微信图片_20200901205011.jpg
代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 109;

int n;
struct point{
   
    int x, y;
    int tag;
    point(){
   }
    point(int _x, int _y, int _tag):x(_x), y(_y), tag(_tag){
   }
    void input(){
   scanf("%d%d%d", &x, &y, &tag);}
};
point plist[N];
int cnt;
point vec1[N], vec2[N];
int cnt1, cnt2;

bool cmp1(point p, point s){
   
    if(p.x == s.x)return p.y < s.y;
    else return p.x < s.x;
}

bool cmp2(point p, point s){
   
    if(p.x == s.x)return p.y > s.y;
    else return p.x > s.x; 
}

typedef pair<double, double>pir;
vector<pir>ans1, ans2;

void work(){
   
    ans1.push_back({
   -3000, 3000});
    ans1.push_back({
   -3000, 2999});
    for(int i = 0; i < cnt1; i++){
   
        double x = vec1[i].x, y = vec1[i].y;
        ans1.push_back({
   x - 0.3, 2999});
        ans1.push_back({
   x - 0.3, y - 0.3});
        ans1.push_back({
   x + 0.3, y - 0.3});
        ans1.push_back({
   x + 0.3, y + 0.3});
        ans1.push_back({
   x - 0.2, y + 0.3});
        while(i + 1 < cnt1 && vec1[i + 1].x == vec1[i].x){
   
            ans1.push_back({
   vec1[i + 1].x - 0.2, vec1[i + 1].y - 0.3});
            ans1.push_back({
   vec1[i + 1].x + 0.3, vec1[i + 1].y - 0.3});
            ans1.push_back({
   vec1[i + 1].x + 0.3, vec1[i + 1].y + 0.3});
            ans1.push_back({
   vec1[i + 1].x - 0.2, vec1[i + 1].y + 0.3});
            i++;
        }
        ans1.push_back({
   x - 0.2, 2999});
    }
    ans1.push_back({
   3000, 2999});
    ans1.push_back({
   3000, 3000});

    ans2.push_back({
   3000, -3000});
    ans2.push_back({
   3000, -2999});
    for(int i = 0; i < cnt2; i++){
   
        double x = vec2[i].x, y = vec2[i].y;
        ans2.push_back({
   x + 0.41, -2999});
        ans2.push_back({
   x + 0.41, y + 0.3});
        ans2.push_back({
   x - 0.19, y + 0.3});
        ans2.push_back({
   x - 0.19, y - 0.3});
        ans2.push_back({
   x + 0.31, y - 0.3});
        while(i + 1 < cnt2 && vec2[i + 1].x == vec2[i].x){
   
            ans2.push_back({
   vec2[i + 1].x + 0.31, vec2[i + 1].y + 0.3});
            ans2.push_back({
   vec2[i + 1].x - 0.19, vec2[i + 1].y + 0.3});
            ans2.push_back({
   vec2[i + 1].x - 0.19, vec2[i + 1].y - 0.3});
            ans2.push_back({
   vec2[i + 1].x + 0.31, vec2[i + 1].y - 0.3});
            i++;
        }
        ans2.push_back({
   x + 0.31, -2999});
    }
    ans2.push_back({
   -3000, -2999});
    ans2.push_back({
   -3000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值