zoukankan      html  css  js  c++  java
  • 【洛谷1282】多米诺骨牌

    Description

    多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的
    上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。
    编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。

    对于图中的例子,只要将最后一个多米诺骨牌旋转180°,可使上下2行点数之差为0。

    Input

    输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1≤a,b≤6。

    Output

    输出文件仅一行,包含一个整数。表示求得的最小旋转次数。

    Sample Input

    4
    6 1
    1 5
    1 3
    1 2

    Sample Output

    1

    题解

    01背包,c[]表示上下两个数的差,翻转一次会使当前的值减小2*c[i],所以要加上2*c[i](上一步)

    状态转移方程f[j]=min(f[j],f[j+2*c[i]]+1)

    初值sum=c[1~n],赋为0,其余赋为极大值。

    当有n个数时,差的范围是[-5*n~5*n],因为不能开负的数组,所以都加上5*n。

    特别注意一点,由于c[i]的值有正有负,所以要注意循环的顺序(道理同01背包)

    答案是从差值为0开始(5*n),向左向右找第一个不是极大值的数,输出。一开始我竟然加了判断是不是0,真是醉了。。。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[1010],b[1010],c[1010];
    int f[20010];
    int n,sum,m;
    int main(){
        scanf("%d",&n);
        for (int i=1;i<=n;i++){
            scanf("%d%d",&a[i],&b[i]);c[i]=a[i]-b[i];sum+=c[i];
        }
        memset(f,127,sizeof(f));m=f[1];
        f[sum+5*n]=0;
        for (int i=1;i<=n;i++){
            if (c[i]<0){
                for (int j=5*n;j>=-5*n;j--){
                    if (j+2*c[i]+5*n>=0) f[j+5*n]=min(f[j+5*n],f[j+2*c[i]+5*n]+1);
                }
            }else if (c[i]>0){
                for (int j=-5*n;j<=5*n;j++){
                    if (j+2*c[i]+5*n>=0) f[j+5*n]=min(f[j+5*n],f[j+2*c[i]+5*n]+1);
                }
            }
        }
        int i=5*n,j=i;
        for (;1;i--,j++) if (f[j]!=m||f[i]!=m) break;
        printf("%d",min(f[i],f[j]));
    }
  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5280946.html
Copyright © 2011-2022 走看看