美文网首页
CUIT MAGICIAN UNION 2017 TRAININ

CUIT MAGICIAN UNION 2017 TRAININ

作者: 简为2016 | 来源:发表于2017-03-17 20:15 被阅读0次

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

#include <cstdio>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <stdlib.h>
#include <map>
#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 <cstdio>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <stdlib.h>
#include <map>
#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 <cstdio>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <stdlib.h>
#include <map>
#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<n;i++)
    {
        scanf("%d%d",&chess[i].STA,&chess[i].END);
    }
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&program[i].STA,&program[i].END);
    }
    sort(chess,chess+n,cmp1);
    sort(program,program+m,cmp4);
    int maxtime = program[0].STA - chess[0].END;
    sort(chess,chess+n,cmp2);
    sort(program,program+m,cmp3);
    maxtime = max(maxtime,chess[0].STA - program[0].END);
    if(maxtime < 0) maxtime = 0;
    printf("%d\n",maxtime);
    return 0;
}

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

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#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; i<m; i++)
    {
        scanf("%d%d",&a,&b);
        if(a>max1)max1=a;
        if(b<min1)min1=b;
    }
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        if(a>max2)max2=a;
        if(b<min2)min2=b;
    }
    if(max2>min1)maxxA=max2-min1;
    if(max1>min2)maxxB=max1-min2;
    printf("%d\n",max(maxxA,maxxB));
    return 0;
}

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

#include <cstdio>
#include <string>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <stdlib.h>
#include <map>
#include <iostream>
#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;
    queue<node>Q;
    Q.push(x);

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

        /*cout<<" x.a : "<<tem.a<<endl;
        cout<<" x.b : "<<tem.b<<endl;
        cout<<" x.prepos : "<<tem.prepos<<endl;
        cout<<" x.pos : "<<tem.pos<<endl;
        cout<<" x.str : "<<tem.str<<endl;
        cout<<" x.step : "<<tem.step<<endl;*/
        if(tem.a == C || tem .b == C)
        {
            cout << tem.step << endl;
            tem2=0;
            pp[tem2++] = tem.str;
            int xx = tem.prepos;
            while(pre[xx].prepos!= -1)
            {
                pp[tem2++] = pre[xx].str;
                xx = pre[xx].prepos;
            }
            for(int i = tem2 - 1 ; i >= 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 TRAININ

      本文链接:https://www.haomeiwen.com/subject/fflynttx.html