The 2013 ACM-ICPC Asia Changsha Regional Contest(2013地域戦練習)

4638 ワード

リンク:http://acm.zju.edu.cn/onlinejudge/showProblems.do?contestId=1&pageNumber=28
試合はA,C,G,H,J,Kを過ぎた.
A,J,Kは小さい仲间に秒されて、K题の比较的に面倒な捜索
H問題は2点でよい,層数がFであることに注意する
C問題の幾何学の問題、私のAので、WAは2発、もとは1種の情況が少なくなって、またチームメートに検査を手伝ってもらって、本心は弱くて、高校は直角三角形の問題を解きます
G題はまずhavelアルゴリズムで1つの解を構築し,次に4つの異なる点i,j,k,uを列挙し,を満たす辺にが存在しないことを列挙し,を辺に置き換えると別の組の解が現れ,試合の時にランダム数でhavelを何度も繰り返した.
D,I問題はできるようだ.
C,Gのコードを貼ってください
C
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const double eps = 1e-8;
struct Point {
    double x, y;
    Point(double x, double y):
    x(x), y(y){}
    Point(){}
    double len() {
        return sqrt(x*x+y*y);
    }
    Point operator+(const Point t) {
        return Point(x+t.x, y+t.y);
    }
    Point operator-(const Point t) {
        return Point (x-t.x, y-t.y);
    }
    Point operator*(const double t) {
        return Point(x*t, y*t);
    }
    Point operator/(const double t) {
        return Point(x/t, y/t);
    }
    void in() {
        scanf("%lf%lf", &x, &y);
    }
}o, v, tp;
double cross(Point a, Point b) {
    return a.x*b.y-a.y*b.x;
}
double dot(Point a, Point b) {
    return a.x*b.x+a.y*b.y;
}
double r1, r2, r3;
int main() {
    int i, j;
    while( ~scanf("%lf%lf%lf", &r1, &r2, &r3)) {
        o.in(); v.in();
        double d = fabs(cross(v, o))/v.len();
        if(dot(v*(-1), o) < eps ||d-r2-r3 > eps) {
            printf("%.6f
", 0.0); continue; } if(d-r1-r3 > eps) { double d1 = r2+r3; double sum = sqrt(d1*d1-d*d); printf("%.6f
", sum*2/v.len()); continue; } double d1 = r2+r3, d2 = r1+r3; double sum = sqrt(d1*d1-d*d)-sqrt(d2*d2-d*d); printf("%.6f
", sum*2/v.len()); } return 0; } /* 5 20 1 0 100 0 -1 5 20 1 30 15 -1 0 1 2 2 10 0 0 10 */
G
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
struct node {
	int d, v;
	bool operator<(const node &t) const {
		return d > t.d || (d==t.d && v > t.v);
	}
	node(int d, int v) :
			d(d), v(v) {
	}
	node() {
	}
} p[104];
int d[104];
bool g[104][104];
int n;
bool havel() {
	int i, j;
	for(i = 1; i <= n; i++)
		p[i] = node(d[i], i);
	for(i = 1; i <= n; i++) {
		sort(p + i, p + n + 1);
		j = i + 1;
		while(p[i].d > 0 && j <= n) {
			if(p[j].d > 0&&p[i].d>0) {
                int u=p[i].v;
                int v=p[j].v;
				g[u][v] = g[v][u] = true;
				p[i].d--;
				p[j].d--;
                j++;
			}
			else return 0;

		}
		if(p[i].d > 0) return 0;
	}
	return 1;
}
int sum;
void out(bool g[][104]) {
	vector<pair<int, int> > v;
	int i, j;
	for(i = 1 ;i <= n; i++)
		for(j = i+1; j <= n; j++) if(g[i][j])
			v.push_back(make_pair(i, j));
	printf("%d %d
", n, sum); for(i = 0; i < v.size(); i++) { if(i) printf(" "); printf("%d", v[i].first); } puts(""); for(i = 0; i < v.size(); i++) { if(i) printf(" "); printf("%d", v[i].second); } puts(""); } int main() { int i, j, k, u; while(~scanf("%d", &n)) { sum = 0; for(i = 1; i <= n; i++) { scanf("%d", &d[i]); sum += d[i]; } sum>>=1; memset(g, false, sizeof(g)); bool flag = havel(); if(!flag) { puts("IMPOSSIBLE"); continue; } int ii = -1, jj, kk, uu; for(i = 1; i <= n; i++) for(j = 1; j <= n; j++) if(g[i][j] && i != j) for(k = 1; k <= n; k++) if(!g[j][k] && k != i && k != j) for(u = 1; u <= n; u++) if(!g[i][u] && g[k][u] && u != i && u != j && u != k) { ii = i, jj = j, kk = k, uu = u; } if(ii == -1) { puts("UNIQUE"); out(g); continue; } else { puts("MULTIPLE"); out(g); //cerr << ii <<" " << jj << " " << kk << " "<< uu << "~~~~" << endl; g[ii][jj] = g[jj][ii] = false; g[kk][uu] = g[uu][kk] = false; g[ii][uu] = g[uu][ii] = true; g[jj][kk] = g[kk][jj] = true; out(g); } } return 0; }