• 【2017 Multi-University Training Contest


    Link:http://acm.hdu.edu.cn/showproblem.php?pid=6140

    Description

    等价于告诉你有n个物品,每个物品的价值为-a[i]或a[i],或者这个物品可以看成两个物品一个为a[i]另外一个为-a[i];
    问你能不能达到物品价值k

    Solution

    爆搜。
    加个看起来不是很有用的剪枝就能过.
    (记录某个位置后面所有的整数的和)
    大数据的背包好像都能这样做。
    (这题数据比较水??)
    【另解】:
    题目描述的上面有说a1=1,b1=’N’
    也就是说-1..1都可以得到;
    假设当前[L..R]都可以得到(L为负,R为正)
    又来了一个数字x
    假设x要加上,且x<=R,
    则L..R+x都可以得到
    假设x要减掉,且x<=|L|
    则L-x..R都可以得到;
    如果可加可减,且x<=min(|L|,R);
    则L-x..R+x都可以得到;
    上面那个很变态的不等式使得这些如果都成立了。。


    NumberOf WA

    1

    Reviw

    大数据背包用dfs

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define ri(x) scanf("%d",&x)
    #define rl(x) scanf("%lld",&x)
    #define rs(x) scanf("%s",x+1)
    #define oi(x) printf("%d",x)
    #define ol(x) printf("%lld",x)
    #define oc putchar(' ')
    #define os(x) printf(x)
    #define all(x) x.begin(),x.end()
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 2e3;
    const int INF = 1e6+10;
    
    int n,k,tot;
    int w[N+10],a[N+10],ma[N+10],mi[N+10];
    char s[N+10][3];
    
    bool dfs(int now,int sum){
        if (sum == k) return true;
        if (now > n) return false;
        if (sum + ma[now] < k) return false;
        if (sum + mi[now] > k) return false;
        if (dfs(now+1,sum+w[now])) return true;
        if (dfs(now+1,sum)) return true;
        return false;
    }
    
    int main(){
        //Open();
        //Close();
        int T;
        ri(T);
        while (T--){
            ri(n),ri(k);
            rep1(i,1,n) ri(a[i]);
            rep1(i,1,n) rs(s[i]);
            tot = 0;
            rep1(i,1,n){
                if (a[i]==0) continue;
                if (s[i][1]=='N'){
                    w[++tot] = a[i];
                    w[++tot] = -a[i];
                }else
                    if (s[i][1]=='L')
                        w[++tot] = a[i];
                    else
                        w[++tot] = -a[i];
            }
            n = tot;
            ma[n+1] = mi[n+1] = 0;
            rep2(i,n,1){
                ma[i] = ma[i+1],mi[i] = mi[i+1];
                if (w[i]>0)
                    ma[i] += w[i];
                if (w[i]<0)
                    mi[i] += w[i];
            }
            if (dfs(1,0))
                puts("yes");
            else
                puts("no");
        }
        return 0;
    }
  • 相关阅读:
    swoole创建进程
    php中,posix_getpid() 和 getmypid() 有什么不同
    php查看进程
    初探PHP多进程
    nginx转发
    mime类型
    acwing 517. 信息传递
    LeetCode 1255 得分最高的单词集合 Maximum Score Words Formed by Letters
    LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands
    算法问题实战策略 SORTGAME
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626109.html
Copyright © 2020-2023  润新知