首页 > 其他分享 >CF1239E Turtle

CF1239E Turtle

时间:2023-06-20 11:57:43浏览次数:51  
标签:Turtle int CF1239E -- print dp

CF1239E Turtle

通过观察我们会发现,第一行一定单调递增,第二行一定单调递减,否则不是最优。再次前提下,乌龟的最优方案只有两种,要么一直向右,最后向下,要么先向下,再一直向右。因此,我们将最小的两个数字放在左上角和右下角,然后把余下数字填入剩余位置,并希望下式最小

显然,这是一个背包问题。

设f[i][j][k]表示前i件物品,取j件,和为k的方案是否存在

f[i][j][k]=f[i-1][j][k]|f[i-1][j-1][k-ai]

从sum/2到0,枚举k,若f【n*2】【n-1】【k】==1,则方案合法,且最大值最小。

#include<bits/stdc++.h>
using namespace std;
const int N=1300000;
bitset<N> dp[53][27];
int a[55],b[N],n,m,sum;
void print(int n,int m,int i){
    if(!m) return;
    if(dp[n-1][m][i]){
        print(n-1,m,i);
        return;
    }
    if(i>=a[n]){
        if(dp[n-1][m-1][i-a[n]]){
            b[a[n]]--;
            print(n-1,m-1,i-a[n]);
            printf("%d ",a[n]);
        }
    }
}
int main(){
    cin>>n;
    m=n<<1;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>a[i+n];
    sort(a+1,a+1+m);
    for(int i=3;i<=m;i++){
        sum+=a[i],b[a[i]]++;
    }
    int tmp=sum;
    sum/=2;
    dp[2][0]=1;//从第三个开始选
    for(int i=3;i<=m;i++){//i个数中,选j个数到a 
        for(int j=0;j<=n-1;j++){
            dp[i][j]|=dp[i-1][j];
            if(j) dp[i][j]|=dp[i-1][j-1]<<a[i];
            //cout<<i<<" "<<j<<" "<<dp[i][j]<<endl;
        }
    } 
    for(int i=sum;i>=0;i--){
        if(dp[m][n-1][i]){
            cout<<a[1]<<" ";
            print(m,n-1,i);
            cout<<endl;
            for(int j=50005;j>=0;j--){
                while(b[j]){
                    b[j]--;
                    printf("%d ",j);
                }
            }
            cout<<a[2]<<endl;
            return 0;
        }
    }
    return 0;
}

 

但是,这么写空间可能会爆,因此我们考虑用bitset优化dp,具体细节见代码

最后我们要输出具体方案,因此不能使用滚动数组,需要在最后递归输出。

 

标签:Turtle,int,CF1239E,--,print,dp
From: https://www.cnblogs.com/DongPD/p/17493235.html

相关文章

  • 实验6 turtle绘图与python库应用编程体验
    实验任务1fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n边形'''foriinrange(n):fd(siz......
  • 实验6 turtle绘图与python库应用编程体验
    实验任务1task1-11fromturtleimport*2defmove(x,y):3penup()4goto(x,y)5pendown()6defdraw(n,size=100):7foriinrange(n):8fd(size)9left(360/n)10defmain():11pensize(2)12pencolor(......
  • 实验6 turtle绘图与python库应用编程体验
    task1-1源代码1fromturtleimport*23defmove(x,y):4'''画笔移动到坐标(x,y)处'''5penup()6goto(x,y)7pendown()89defdraw(n,size=100):10'''绘制边长为size的正n变形'''1......
  • 实验6 turtle绘图与Python库应用编程体验
    task1-1.py实验源码:fromturtleimport*defmove(x,y):penup()goto(x,y)pendown()defdraw(n,size=100):foriinrange(n):fd(size)left(360/n)defmain():pensize(2)pencolor('red')move(-200,0)......
  • 实验6 turtle绘图与python库应用编程体验
    task1_1代码:fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • 实验6 turtle绘图与python库应用编程体验
    实验任务1task1_1.py程序源码:1fromturtleimport*23defmove(x,y):#画笔移动到坐标(x,y)处4penup()5goto(x,y)6pendown()78defdraw(n,size=100):#绘制边长为size的正n变形9foriinrange(n):10forward(size)11......
  • 实验六 turtle绘图与python库应用编程体验
    1fromturtleimport*234defmove(x,y):5penup()6goto(x,y)7pendown()8910defdraw(n,size=100):11foriinrange(n):12fd(size)13left(360/n)141516defmain():17pensize(2)18pen......
  • 实验6 turtle绘图与python库应用编程体验
    task1_11fromturtleimport*234defmove(x,y):5penup()6goto(x,y)7pendown()8910defdraw(n,size=100):11foriinrange(n):12fd(size)13left(360/n)141516defmain():17pensize(2)18......
  • 实验六 turtle绘图与python库应用编程体验
    task1_1实验源码:fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • 用 Python + turtle 模块绘制五星红旗
    用Python绘制五星红旗在这个代码示例中,我将介绍如何使用Python的turtle模块绘制五星红旗。turtle模块是一个图形库,可以轻松地在Python中实现简单的绘图功能。导入模块首先,我们需要导入turtle模块和math模块,以便能够使用数学函数来计算五角星的边长、比例尺等参数......