CUIT MAGICIAN UNION 2017 TRAINING #2

第一题 Expanding Rods POJ 1905 题解算法:二分搜索

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 101001
#define ll long long
#define eps 1e-6
#define biaoji printf("\n!!\n");
using namespace std;

int main()
{
    double l,n,C;
    while(scanf("%lf%lf%lf",&l,&n,&C)!=EOF)
    {
        if(l == -1 && n == -1 && C == -1){
            break;
        }

        double l1 = ( 1 + n * C ) * l;
        double L = 0.0 , R = 0.5*l , h;
        while(R-L>eps)
        {
            h = ( L + R )/2;
            double r = ( 4 * h * h + l * l ) / ( 8 * h );
            if( 2 * r * asin(l/(2*r)) < l1 ) L = h;
            else R = h;
        }
        printf("%.3f\n",h);
    }
    return 0;
}

第二题 Frogger POJ 2253 题解算法:最小生成树kruskal

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 101001
#define ll long long
#define eps 1e-6
#define biaoji printf("\n!!\n");
using namespace std;

int pre[1010];

int Find(int x)
{
    if(pre[x] == x) return x;
    return pre[x] = Find(pre[x]);
}

void Union(int a,int b)
{
    int A = Find(a);
    int B = Find(b);
    if( A != B)
    {
        pre[B] = A;
    }
}

struct Node
{
    double x,y;
    int id;
}node[1010];

struct NODE
{
    int u,v;
    double dis;
}road[1001000];

bool cmp(NODE a,NODE b)
{
    return a.dis < b.dis;
}


double getdis(Node a,Node b)
{
    double dis = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    return dis;
}

int main()
{
    int n,cas=1;
    while(scanf("%d",&n) && n)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&node[i].x,&node[i].y);
            node[i].id = 1;
        }

        int cnt = 0;
        for(int i = 1; i <= n; i++)
        {
            for(int j = i + 1 ; j <= n ; j++)
            {
                road[cnt].u = i,road[cnt].v = j;
                road[cnt].dis = getdis(node[i],node[j]);
                cnt++;
            }
        }
        sort(road,road+cnt,cmp);
        for( int i = 1 ; i <= n ; i++)
        {
            pre[i] = i;
        }

        double mindis;
        for( int i = 0 ; i < cnt ;i++)
        {
            if(Find(1) != Find(2))
            {
                Union(road[i].u,road[i].v);
                mindis = road[i].dis;
            }
            else
            {
                break;
            }
        }
        printf("Scenario #%d\n",cas++);
        printf("Frog Distance = %.3f\n",mindis);
        printf("\n");
    }
    return 0;
}

第三题 Anton and Classes codeforces 785B 题解算法:暴力

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 101001
#define ll long long
#define eps 1e-6
#define biaoji printf("\n!!\n");
using namespace std;

struct CH
{
    int STA,END;
}chess[200200];

struct pro
{
    int STA,END;
}program[200200];

bool cmp1(CH a,CH b)
{
    return a.END < b.END;
}

bool cmp2(CH a,CH b)
{
    return a.STA > b.STA;
}

bool cmp3(pro a,pro b)
{
    return a.END < b.END;
}

bool cmp4(pro a,pro b)
{
    return a.STA > b.STA;
}

int main()
{
    int n,m;
    scanf("%d",&n);
    for(int i=0;i

第三题优化代码(Come from fold)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long int
#define pi acos(-1)
#define mod 1000000007
#define inf 0x7fffffff
using namespace std;

int main()
{
    int m,n,a,b;
    int max1=0,min1=inf,max2=0,min2=inf;
    int maxxA=0,maxxB=0;
    scanf("%d",&m);
    for(int i=0; imax1)max1=a;
        if(bmax2)max2=a;
        if(bmin1)maxxA=max2-min1;
    if(max1>min2)maxxB=max1-min2;
    printf("%d\n",max(maxxA,maxxB));
    return 0;
}

第四道题 Pots POJ3414 题解算法:BFS

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define maxn 101001
#define ll long long
#define eps 1e-6
#define biaoji printf("\n!!\n");
using namespace std;

int tem2;
int A,B,C;
int pp[1000];
int vis[110][110];

struct node
{
    int a,b;
    int pos;
    int prepos;
    int str;
    int step;
} pre[100100];

void bfs()
{
    node x;
    int pos = 0 ;
    x.a = 0;
    x.b = 0;
    x.prepos = -1;
    x.step = 0;
    x.str = 0;
    x.pos=0;
    pre[pos++] = x;
    vis[x.a][x.b] = 1;
    queueQ;
    Q.push(x);

    memset(vis,0,sizeof(vis));
    while(!Q.empty())
    {
        node tem = Q.front();
        Q.pop();

        /*cout<<" x.a : "<= 0; i --)
            {
                if(pp[i] == 1){printf("FILL(1)\n");}
                if(pp[i] == 2){printf("FILL(2)\n");}
                if(pp[i] == 3){printf("DROP(1)\n");}
                if(pp[i] == 4){printf("DROP(2)\n");}
                if(pp[i] == 5){printf("POUR(1,2)\n");}
                if(pp[i] == 6){printf("POUR(2,1)\n");}
            }
            return ;
        }
        else
        {
            node tem3;
            if(tem.a != A)
            {
                tem3.a = A;
                tem3.b = tem.b;
                if(vis[tem3.a][tem3.b] == 0)
                {
                    vis[tem3.a][tem3.b] = 1;
                    tem3.prepos = tem.pos;
                    tem3.str = 1;
                    tem3.step = tem.step+1;
                    tem3.pos = pos;
                    pre[pos++] = tem3;
                    Q.push(tem3);
                }
            }
            if(tem.b != B)
            {
                tem3.a = tem.a;
                tem3.b = B;
                if(vis[tem3.a][tem3.b] == 0)
                {
                    vis[tem3.a][tem3.b] = 1;
                    tem3.prepos = tem.pos;
                    tem3.pos = pos;
                    tem3.str = 2;
                    tem3.step = tem.step + 1;
                    pre[pos++] = tem3;
                    Q.push(tem3);
                }

            }
            if(tem.a != 0)
            {
                tem3.a = 0;
                tem3.b = tem.b;
                if(vis[tem3.a][tem3.b] == 0)
                {
                    vis[tem3.a][tem3.b] = 1;
                    tem3.prepos = tem.pos;
                    tem3.pos = pos;
                    tem3.str = 3;
                    tem3.step = tem.step + 1;
                    pre[pos++] = tem3;
                    Q.push(tem3);
                }
            }
            if(tem.b != 0)
            {
                tem3.a = tem.a;
                tem3.b = 0;
                if(vis[tem3.a][tem3.b] == 0)
                {
                    vis[tem3.a][tem3.b] = 1;
                    tem3.prepos = tem.pos;
                    tem3.pos = pos;
                    tem3.str = 4;
                    tem3.step = tem.step + 1;
                    pre[pos++] = tem3;
                    Q.push(tem3);
                }

            }
            if(tem.b != B && tem.a != 0 )
            {
                if(tem.b + tem.a <= B)
                {
                    tem3.a = 0;
                    tem3.b = tem.a + tem.b;
                }
                else if(tem.b + tem.a > B)
                {
                    tem3.b = B;
                    tem3.a = tem.a - (B - tem.b);
                }
                if(vis[tem3.a][tem3.b] == 0)
                {
                    vis[tem3.a][tem3.b] = 1;
                    tem3.prepos = tem.pos;
                    tem3.pos = pos;
                    tem3.str = 5;
                    tem3.step = tem.step + 1;
                    pre[pos++] = tem3;
                    Q.push(tem3);
                }
            }
            if(tem.a != A && tem.b != 0)
            {
                if(tem.b + tem.a <= A)
                {
                    tem3.a = tem.a + tem.b;
                    tem3.b = 0;
                }
                else if(tem.b + tem.a > A)
                {
                    tem3.b = tem.b - ( A - tem.a );
                    tem3.a = A;
                }
                if(vis[tem3.a][tem3.b] == 0)
                {
                    vis[tem3.a][tem3.b] = 1;
                    tem3.prepos = tem.pos;
                    tem3.pos = pos;
                    tem3.str = 6;
                    tem3.step = tem.step + 1;
                    pre[pos++] = tem3;
                    Q.push(tem3);
                }
            }
        }

    }
    printf("impossible\n");
    return ;

}


void solve()
{
    scanf("%d%d%d",&A,&B,&C);
    bfs();
}

int main()
{
    int casenum = 1;
    while(casenum--)
    {
        solve();
    }
    return 0;
}

第五题 Marriage Match IV HDU 3416
我没有做出来,应该是最大流和最短路的混合,自己去做吧。

你可能感兴趣的:(CUIT MAGICIAN UNION 2017 TRAINING #2)