标签:
Description:
Input:
Output:
Sample Input:
Sample Output:
#include<stdio.h> #include<string.h> #include<queue> #include<math.h> #include<stdlib.h> #include<algorithm> using namespace std; const int N=1e6+10; const int INF=0x3f3f3f3f; const int MOD=1e9+7; typedef long long LL; char s[N]; int a[N]; int main () { int T, len, i, k = 0; int cou, Min, ans; ///cou统计每个区间?的个数,Min记录每个?区间内数组a的最小值 char Start, End; ///Start为?区间的前一个字符,End为?区间的后一个字符 scanf("%d", &T); while (T--) { scanf("%s", s); len = strlen(s); for (i = 0; i < len; i++) scanf("%d", &a[i]); k++; cou = 0; Min = INF; Start = End = ‘0‘; ///初始化为0,避免s[0]就是?,并且初始化为0并不影响这个二进制 ans = 0; for (i = 0; i < len; i++) { if (s[i] == ‘?‘) { ans += a[i]; cou++; Min = min(Min, a[i]); } else { End = s[i]; if (cou > 0) ///当cou==0时不能进行这一步,会出现多加多减的情况 { ans += a[i]; ///?区间后的第一个字符对应的值要加上 if (cou % 2 == 0 && Start == End) ///特判如0????0这种情况 ans -= min(Min, a[i]); else if (cou % 2 != 0 && Start != End) ///特判如0???1这种情况 ans -= min(Min, a[i]); } if (i == 0 && s[i] == ‘1‘) ans += a[i]; if (i > 0 && s[i-1] != ‘?‘ && s[i] != s[i-1]) ans += a[i]; ///都是数字并且不相等,可以直接加上 Start = s[i]; Min = INF; cou = 0; } } printf("Case #%d: %d\n", k, ans); } return 0; }
HDU HDU 5375 Gray code(二进制和格雷码)
标签:
原文地址:http://www.cnblogs.com/syhandll/p/4950697.html