1. 程式人生 > >清北學堂模擬賽d4t1 a

清北學堂模擬賽d4t1 a

死循環 分享 string turn div nbsp src stream algo

技術分享

技術分享

分析:大模擬,沒什麽好說的.我在考場上犯了一個超級低級的錯誤:while (scanf("%s",s + 1)),導致了死循環,血的教訓啊,以後要記住了.

/*
    1.沒有發生改變,check一下
    2.將一位1變成0
    3.添一位
    4.減一位
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n,len,ss[3010],b[3010];
char s[3010];
bool flag = false; bool check() { int res = 0; for (int i = 1;i <= n; i++) if (ss[i] == 1) res += i; if (res % (n + 1) == 0) return true; return false; } bool check2() { int res = 0; for (int i = 1; i <= n; i++) if (b[i] == 1
) res += i; if (res % (n + 1) == 0) return true; return false; } void print() { for (int i = 1; i <= n; i++) printf("%d",ss[i]); printf("\n"); } void add(int x,int y) { memcpy(b,ss,sizeof(ss)); for (int i = n; i > x; i--) b[i]
= b[i-1]; b[x] = y; if (check2()) { memcpy(ss,b,sizeof(ss)); flag = 1; } } void eras(int x) { memcpy(b,ss,sizeof(ss)); for (int i = x; i <= n; i++) b[i] = b[i + 1]; if (check2()) { memcpy(ss,b,sizeof(ss)); flag = 1; } } int main() { scanf("%d",&n); while(scanf("%s",s + 1) != EOF) { memset(b,0,sizeof(b)); len = strlen(s + 1); flag = false; if (abs(n - len) > 1) { printf("-1\n"); continue; } for (int i = 1; i <= len; i++) ss[i] = s[i] - 0; if (n == len) { if (check()) //1 { print(); continue; } for (int i = 1; i <= n; i++) //2 { if (ss[i] == 1) { ss[i] = 0; if (check()) { flag = 1; break; } ss[i] = 1; } } } if (flag) { print(); continue; } if (len == n - 1) { for (int i = 1; i <= n + 1; i++) //3 for (int j = 0; j <= 1; j++) { add(i,j); //i位以及以後都要往後挪1 if (flag) break; } } if (flag) { print(); continue; } if (len == n + 1) { for (int i = 1; i <= n; i++) { eras(i); if (flag) break; } } if (flag) { print(); continue; } printf("-1\n"); } return 0; }

清北學堂模擬賽d4t1 a