//5个方向 int dx[] = {0, 0, 1, 0, -1}; int dy[] = {0, 1, 0, -1, 0};
int ans = 20; voidchange(int x, int y){ for (int i = 0; i < 5; i++) { int ax = x + dx[i]; int ay = y + dy[i]; if (ax < 0 || ax > 4 || ay < 0 || ay > 4) continue; if (mp[ax][ay] == 'w') mp[ax][ay] = 'b'; else mp[ax][ay] = 'w'; } } boolcheck(){ char x = mp[0][0]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (mp[i][j] != x) returnfalse; } } returntrue; } voiddfs(int dep, int used){ if (dep == 16) { if (check()) ans = min(ans, used); return ; } dfs(dep + 1, used); int x = dep / 4, y = dep % 4; change(x, y); dfs(dep + 1, used + 1); change(x, y);//回溯 } intmain(){ for (int i = 0; i < 4; i++) { scanf("%s", mp[i]); } dfs(0, 0);//最开始在第0层 if (ans == 20) printf("Impossible\n");//注意判断无解 elseprintf("%d\n", ans); return0; }
int a[N], sum[N]; intmain(){ int n, s; scanf("%d%d", &n, &s); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); sum[i] = sum[i - 1] + a[i]; } int ans = n + 1; //枚举左端点 for (int i = 1; i <= n; i++) { //在 [i,n] 区间内去找一个满足条件的最小的右端点 int l = i, r = n, best = -1; while(l <= r) { int mid = (l + r) / 2; if (sum[mid] - sum[i - 1] >= s) { best = mid; r = mid - 1; } else l = mid + 1; } if (best != -1) ans = min(ans, best - i + 1); } if (ans == n + 1) printf("0\n");//判断无解 elseprintf("%d\n", ans); return0; }
int a[N]; intmain(){ int n, s; scanf("%d%d", &n, &s); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } int j = 0; int tmp = 0; int ans = n + 1; //确定左端点 for (int i = 1; i <= n; i++) { //右端点进行滑动 //尽可能地向右找 while(j + 1 <= n && tmp < s) tmp += a[j + 1], j++; if (tmp >= s) ans = min(ans, j - i + 1); tmp -= a[i];//左端向右滑动,因此总和要减掉这个数 } if (ans == n + 1) printf("0\n"); elseprintf("%d\n", ans); return0; }