Educational Codeforces Round 73 (Rated for Div. 2)

Educational Codeforces Round 73 (Rated for Div. 2) 

2048 Game (手速)

 在 multiset 中玩 2048 游戏,能构成一个 2048 输出 yes

    int n,m,t;
    int i,j,k;
    map<int,int> mp;

int main()
{
    //IOS;
    const int aim=2048;
    rush(){
        sd(n);
        mp.clear();
        for(i=1;i<=n;i++){
            int x; sd(x);
            mp[x]++;
        }
        if(mp.count(aim)){ puts("YES"); continue; }
        for(int i=1;i<aim;i=i*2){
            int cnt=mp[i]/2;
            //debug(cnt);
            mp[i<<1]+=cnt;
        }
        if(mp[aim]) puts("yes");
        else puts("no");
    }
    //PAUSE;
}

 B. Knights(规律)

在 n*n 的棋盘上,有黑白马,不同颜色的相互攻击,马走日,求如何布置他们使得攻击次数最多 

借用一下题目当中的图 

在下图中,蓝色与绿色环属于蓝色方块,粉红色环属于行色方块

蓝色环为红色方块可以攻击的对象

粉红色环是蓝色环的攻击对象

绿色环是粉红色环的攻击对象

 

这样就可以找到规律:

奇数行奇数列放 蓝色,偶数行偶数列放 蓝色,其余放 红色


const int N=100+5;
 
    int n,m,t;
    int i,j,k;
    char ch[N][N];

int main()
{
    while(sd(n)==1)
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                int now=i+j;
                if(now&1) ch[i][j]='W';
                else ch[i][j]='B';
                pc(ch[i][j]);
            }
            puts("");
        }
}

 

Perfect Team  

参加比赛的有 3 种人,分别是 a,b,c 每个队至少有 一个 a 和一个 b,c 可选可不选 ,三人一队,最多可以形成多少队

假设 min=min(a,b)

如果 min<=c 答案为 ans

如果 min>c ,那么消耗完了 c 之后, a,b 两种人组队

即 a=a-min,b=b-min

每个队里含 2a+b 或 2b+a

这个问题之前做过 

int main()
{
    //IOS;
    rush(){
        Pair a[3];
        sddd(a[0].fr,a[1].fr,a[2].fr);
        a[0].sc=0,a[1].sc=1,a[2].sc=2;//映射原位置
        sort(a,a+3);
        ll ans=a[0].fr;
        a[1].fr-=a[0].fr,a[2].fr-=a[0].fr,a[0].fr=0;
        if(a[0].sc==2){
            int x=a[1].fr;
            int y=a[2].fr;
            if(y>=2*x) ans+=x;
            else{
                int tmp=y-x;
                ans+=tmp;
                ans+=(x-tmp)*2ll/3;
            }
        }
        pll(ans);
    }
  // PAUSE;
}

Make The Fence Great Again(DP)

 给出 n 个栅栏的高度及伸长 1 米的价格,要使得相邻的栅栏不能是相同高度,最少的花费

本来想同模拟来做,但是每次更改长度后都要对区间进行一次排序,复杂度比较高,就放弃了 

每一个栅栏最多伸长 2 米,假设 a[i-1]=x-1,a[i]=x,a[i+1]=x+1,这是最坏的情况

我们要考虑第 i 个到底伸长几米取决于第 i-1 个,选取 i-1,i,i+1 中花费最少的那一种方案

const int N=3e5+5;
 
    int n,m,t;
    int i,j,k;
    Pair p[N];
    map<int,int> mp;
    ll dp[N][3];

int main()
{
    //IOS;
    rush(){
        sd(n);
        mp.clear();
        for(i=1;i<=n;i++){
            sd(p[i].fr);//高度
            sd(p[i].sc);//价格    
            dp[i][0]=dp[i][1]=dp[i][2]=1e18;
        }

        dp[1][0]=0;
        dp[1][1]=p[1].sc;
        dp[1][2]=p[1].sc*2ll;
        for(i=2;i<=n;i++){
            for(j=0;j<3;j++){
                for(k=0;k<3;k++){
                    if(p[i].fr+j != p[i-1].fr+k){
                        //第 i 个在第 i-1个伸长 k 米的情况下伸长 j 米
                        dp[i][j]=min(dp[i][j],dp[i-1][k]+p[i].sc*1ll*j);
                    }
                }
            }
        }
        cout<<min( min(dp[n][0],dp[n][1]),dp[n][2] )<<endl;
    }
    //PAUSE;
}

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页