zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626109.html
Copyright © 2011-2022 走看看