乌鲁木齐icpc2017网络赛DI题

Posted 心里只有学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乌鲁木齐icpc2017网络赛DI题相关的知识,希望对你有一定的参考价值。

I、用两种颜色给n(<=100)个点的完全图的边染色,使得纯色三角形的个数最少(输出最少个数和任一一种构造方案)

题解:

  组合极值中的异色角相关知识,异色三角形个数=异色角个数/2,ans=C(n,3)-异色三角形个数。设点i连出去的边中,染第一种颜色的边数为si,则异色角=∑((n-1)-si)*si,由二次函数性质,让si接近(n-1)/2即可。当n为偶数的时候,将点分成两部分,第一种颜色的边呈完全二分图形式;n=4k+1的时候,所有的点排成一个圈,向左右分别连k个;n=4k+3的时候,向左右分别连k个,再让0~k号点连k+1~2*k+1号点,2*k+2~3*k+1号点连3*k+3~4*k+2号点即可。

 

 

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
int mapp[600][600];
int t,n,s,j,ans,du,tp,k;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        rep(i,0,n-1)
            rep(j,0,n-1)
                mapp[i][j]=1;
        if (n%2==0)
        {
            rep(i,0,n/2-1)
                rep(j,n/2,n-1)
                    mapp[i][j]=mapp[j][i]=2;
        }   else
        {
            s=(n-1)/4;
            rep(i,0,n-1)
                rep(j,i-s,i+s)
                    mapp[i][(j+n)%n]=mapp[(j+n)%n][i]=2;
            if (n%4==3)
            {
                k=s;
                rep(i,0,k)
                    mapp[i][i+k+1]=mapp[i+k+1][i]=2;
                rep(i,2*k+2,3*k+1)
                    mapp[i][i+k+1]=mapp[i+k+1][i]=2;
            }
        }
        rep(i,0,n-1) mapp[i][i]=0;
        ans=n*(n-1)*(n-2)/6;
        tp=0;
        rep(i,0,n-1)
        {
            du=0;
            rep(j,0,n-1) if (mapp[i][j]==2) ++du;
            tp+=du*(n-1-du);
        }
        ans-=tp/2;
        printf("%d\n",ans);
        rep(i,0,n-1)
        {
            rep(j,0,n-1)
                printf("%d ",mapp[i][j]);
            printf("\n");
        }
    }
    return 0;
}

 

 

D、题目描述有点长,懒得写了

题解:

  注意到,任何时刻的最佳策略之一一定是走到最左边或者最右边的点,hack它们(假如你先hack了中间的,终究要hack最旁边的。假设hack最旁边的点的时间为t1,由于行进的终点又在中间k处,hack不需要时间,所以哪怕走到最旁边的点,等到t1时间,以后路过中间的哪些点再顺手hack,时间也不会变长),那么只要做一个排序,用左边剩余l个点,右边剩余r个点,当前在左边或右边(0,1)作为状态dp即可,复杂度O(n2)

Hint:

  开始位置在0处,而且这是一道poj1991的原题

 

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
const int INF=1000000000;
int t,n,l,k,ltot,rtot,x,y,tp,ans;
int dp[2000][2000][2];
struct port{
    int cd,dist;
}pl[1010],pr[1010];

bool cmp1(const port &a,const port &b)
{
    return (a.dist<b.dist) || (a.dist==b.dist && a.cd<b.cd);
}

bool cmp2(const port &a,const port &b)
{
    return (a.dist>b.dist) || (a.dist==b.dist && a.cd<b.cd);
}

int main()
{
    scanf("%d",&t);
    rep(T,1,t)
    {
        scanf("%d%d%d",&n,&l,&k);
        ltot=rtot=0;
        rep(i,1,n)
        {
            scanf("%d%d",&x,&y);
            if (x<=k)
            {
                pl[++ltot].cd=y;
                pl[ltot].dist=x;
            }   else
            {
                pr[++rtot].cd=y;
                pr[rtot].dist=x;
            }
        }
        sort(pl+1,pl+ltot+1,cmp1);
        sort(pr+1,pr+rtot+1,cmp2);
        pl[0].dist=pr[0].dist=0;
        rep(i,0,ltot)
            rep(j,0,rtot)
                dp[i][j][0]=dp[i][j][1]=INF;
        dp[1][0][0]=max(pl[1].dist,pl[1].cd);dp[0][1][1]=max(pr[1].dist,pr[1].cd);
        rep(i,0,ltot)
            rep(j,0,rtot)
            {
                if (i>0)
                {
                    tp=max(dp[i-1][j][0]+pl[i].dist-pl[i-1].dist,pl[i].cd);
                    dp[i][j][0]=min(dp[i][j][0],tp);
                    tp=max(dp[i-1][j][1]+pr[j].dist-pl[i].dist,pl[i].cd);
                    dp[i][j][0]=min(dp[i][j][0],tp);
                }
                if (j>0)
                {
                    tp=max(dp[i][j-1][1]+pr[j-1].dist-pr[j].dist,pr[j].cd);
                    dp[i][j][1]=min(dp[i][j][1],tp);
                    tp=max(dp[i][j-1][0]+pr[j].dist-pl[i].dist,pr[j].cd);
                    dp[i][j][1]=min(dp[i][j][1],tp);
                }

                //cout<<i<<" "<<j<<" "<<dp[i][j][0]<<" "<<dp[i][j][1]<<endl;
            }
        ans=min(dp[ltot][rtot][0]+k-pl[ltot].dist,dp[ltot][rtot][1]+pr[rtot].dist-k);
        printf("Case #%d: %d\n",T,ans);
    }
    return 0;
}

 

以上是关于乌鲁木齐icpc2017网络赛DI题的主要内容,如果未能解决你的问题,请参考以下文章

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-A banana·

2017icpc 乌鲁木齐网络赛

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 F. Islands

2017icpc乌鲁木齐网络赛Colored Graph (构造)

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing (拓扑排序+假dp)