2017CCPC Final (哈尔滨)

Time:

Link


A

分析

 ym:czh推了个公式,答案是n-1,没加Case wa了一发,我来背锅了


B

题意

 

分析

 


C

分析

ym:简单的博弈游戏,大家一起玩一玩就清楚套路了


 

D

题意

 

分析

 


E

分析

签到,简单的模拟


F

题意

 

分析

 


G

题意

 给出一些区间,让你选k个区间,使其覆盖的点最多

分析

 czh:定义dp[i][j] :前i个点,选择j个区间的最大值。

#include <iostream>
#include <cstdio>
using namespace std;
#define ll long long

const int maxn = 2005;

int t[maxn],dp[maxn][maxn];
int main()
{
    int T;
    cin>>T;
    for(int cn=1;cn<=T;cn++)
    {
        int ans=0;
        int n,m,k;
        scanf("%d %d %d",&n,&m,&k);
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=k;j++)dp[i][j]=0;
            t[i]=0;
        }
        for(int i=1;i<=m;i++)
        {
            int x,y;
            scanf("%d %d",&x,&y);
            for(int j=x;j<=y;j++)
            {
                t[j]=max(t[j],y);
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(t[i])
                    dp[t[i]][j]=max(dp[t[i]][j],dp[i-1][j-1]+t[i]-i+1);
                dp[i][j]=max(dp[i][j],dp[i-1][j]);
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=k;j++)
                ans=max(ans,dp[i][j]);
         cout<<"Case #"<<cn<<": ";
        cout<<ans<<endl;
    }
    return 0;
}

  


H

题意

 

分析

 


I

题意

 

分析

 


J

题意

 

分析

czh: 一道简单的差分约束题

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=2005;
int f[maxn],w[maxn*3],to[maxn*3],nex[maxn*3];
bool vis[maxn];
int out[maxn],cnt=0,dis[maxn],n,m,k;
void add(int a,int b,int c)
{
    cnt++;
    w[cnt]=c;
    to[cnt]=b;
    nex[cnt]=f[a];
    f[a]=cnt;
}
bool spfa()
{
    for(int i=1; i<maxn; i++)dis[i]=-1,vis[i]=0,out[i]=0;
    queue<int>que;
    que.push(1);
    vis[1]=1;
    dis[1]=0;
    while(que.size())
    {
      //  for(int i=1;i<=n;i++)printf(" %d",dis[i]);cout<<endl;
        int x=que.front();
      //  cout<<x<<"out"<<endl;
        vis[x]=0;
        que.pop();
        out[x]++;
        if(out[x]>n)
            return false;
        for(int i=f[x]; i; i=nex[i])
        {
          //  cout<<to[i]<<"to"<<endl;
            if(dis[x]+w[i]>dis[to[i]])
            {
                dis[to[i]]=dis[x]+w[i];
                if(vis[to[i]]==0)
                {
                    que.push(to[i]);
                    vis[to[i]]=1;
                }
            }
        }
    }
    return true;
}
int main()
{
    int T;
    cin>>T;
    for(int cn=1; cn<=T; cn++)
    {
        cnt=0;
        scanf("%d %d %d",&n,&m,&k);
        for(int i=1; i<maxn; i++)f[i]=0;
        for(int i=2; i<=n; i++)
            add(i-1,i,1);
        for(int i=1; i<=m; i++)
        {
            int a,b,c,d;
            scanf("%d %d %d %d",&a,&b,&c,&d);
            if(a==b&&c==d)
            {
                add(b,c,k);
                add(c,b,-k);
            }
            else
            {
                add(c,b,1-k);
                add(a,d,k+1);
            }
        }
        if(spfa())
        {
            printf("Case #%d:",cn);
            for(int i=2;i<=n;i++)
                printf(" %d",dis[i]-dis[i-1]);
            cout<<endl;
        }
        else
            printf("Case #%d: IMPOSSIBLE\n",cn);
    }
    return 0;
}

  


K

分析

ym:差分打表,会发现差分结果差21,推出一个多项式,但要用高精度, 但Java不熟悉耽误了半天时间


Summary:

ym:没加Case 贡献一发罚时,x,y搞反了贡献一发罚时,震惊,ym贡献了全队2/3的罚时

czh:

hxx: 

posted @ 2018-09-14 23:22  Deadlined  阅读(228)  评论(0编辑  收藏  举报