zoukankan      html  css  js  c++  java
  • HDU 5375 Gray code

    题意:给出一个二进制数,其中有些位的数字不确定,对于所有对应的格雷码,与一个序列a对应,第i位数字为1时得分a[i],求最大的得分。

    解法:一个二进制数x对应的格雷码为x ^ (x >> 1),题解说是个dp……但其实就四种情况……判一下就好了

    代码:

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<string.h>
    #include<math.h>
    #include<limits.h>
    #include<time.h>
    #include<stdlib.h>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #define LL long long
    using namespace std;
    string s;
    LL a[200005];
    int main()
    {
        int T, cse;
        while(~scanf("%d", &T))
        {
            cse = 1;
            while(T--)
            {
                cin >> s;
                int n = s.size();
                string s1 = '0' + s;
                s1.erase(s1.end() - 1);
                for(int i = 0; i < n; i++)
                    scanf("%lld", &a[i]);
                char st = '0';
                LL ans = 0;
                for(int i = 0; i < n; i++)
                {
                    if(s[i] != '?')
                    {
                        if(s[i] != s1[i])
                            ans += a[i];
                        st = s[i];
                    }
                    else
                    {
                        int cnt = 0;
                        LL sum = 0, minn = a[i];
                        while(i < n && s[i] == '?')
                        {
                            cnt++;
                            sum += a[i];
                            minn = min(minn, a[i]);
                            i++;
                        }
                        char ed;
                        if(i < n)
                        {
                            ed = s[i];
                            sum += a[i];
                            minn = min(minn, a[i]);
                        }
                        else
                        {
                            ans += sum;
                            break;
                        }
                        if(st == ed)
                        {
                            if(cnt & 1)
                                ans += sum;
                            else
                                ans += sum - minn;
                        }
                        else
                        {
                            if(cnt & 1)
                                ans += sum - minn;
                            else
                                ans += sum;
                        }
                        st = s[i];
                    }
                }
                printf("Case #%d: %lld
    ", cse++, ans);
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    NYIST 46 最少乘法次数
    OpenSSL命令---rsa
    Javah生成JNI头文件
    Stbdroid之ShapeDrawable
    Android之判断设备网络连接状态,并判断连接方式
    [置顶] 程序员必知(二):位图(bitmap)
    中断子系统8_软中断入口处理
    二叉搜索树的后续遍历序列
    整理生命
    sicily9162. RAZLIKA
  • 原文地址:https://www.cnblogs.com/Apro/p/4722613.html
Copyright © 2011-2022 走看看