您的位置:首页 > 其它

GCJ Qualification Round 2016 B题

2016-04-09 11:17 435 查看
经典的翻饼问题,直接做:从下往上看,已翻好的饼忽略掉;从上往下,连续的已翻好的一起翻过来;整个翻过来。

/*
* Author    : ben
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
typedef long long LL;
char pancakes[110];
bool pan[110];
int pannum;

void inline flippan(int n) {
bool *first = pan;
bool *last = first + n;
while ((first != last) && (first != --last)) {
bool tmp = !(*last);
*last = !(*first);
*first = tmp;
++first;
}
if (n % 2 == 1) {
pan[n / 2] = !pan[n / 2];
}
}

int work() {
int ans = 0;
while (pannum > 0) {
while (pannum > 0 && pan[pannum - 1]) {
pannum--;
}
if (pannum <= 0) {
break;
}
int I = 0;
while (pan[I]) {
I++;
}
if (I > 0) {
flippan(I);
ans++;
}
flippan(pannum);
ans++;
}
return ans;
}

int main() {
//    freopen("b.small.in", "r", stdin);
int T;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
scanf(" %s", pancakes);
pannum = strlen(pancakes);
for (int i = 0; i < pannum; i++) {
if (pancakes[i] == '-') {
pan[i] = 0;
} else {
pan[i] = 1;
}
}
printf("Case #%d: %d\n", t, work());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: