这个标的是dp,但是我感觉就只能算思维题,不是特别难,
你仔细想想就知道,你先求出01这样子满足条件的个数,如果要进行改变,最多只可以增加两个,也可以增加一个或者不增加。
如果有连续的两个1或者0那么肯定至少可以增加一个,如果有两个不同的00 或者11 或者是两个11连续 或者两个00不连续 或者三个相同的0或者1都是可以增加两个的。
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <vector> #include <algorithm> #define inf 0x3ff3f3f using namespace std; const int maxn = 1e6 + 10; char a[maxn]; int num[maxn]; int main() { int n; scanf("%d", &n); scanf("%s", a + 1); int len = strlen(a + 1); int ans = 1; int f = 1; for(int i=1;i<=len;i++) num[i] = a[i] - '0'; int flag = num[1]; for(int i=2;i<=len;i++) if (num[i] == !flag) flag = num[i], ans++; for (int i = 1; i < len; i++) if (num[i] == num[i + 1]) f = 0; //printf("%d ", ans); int ex = 0; if(f) printf("%d ", ans); else { for(int i=1;i<len;i++) { if(num[i]==num[i+1]) { ex++; int x = i; while (num[x] == num[x + 1]) x++; i = x; } } for (int i = 1; i < len - 1; i++) if (num[i] == num[i + 1] && num[i] == num[i + 2]) ex = 2; if (ex >= 2) printf("%d ", ans + 2); else printf("%d ", ans + 1); } return 0; } /* 56 10101011010101010101010101010101010101011010101010101010 */
这个题目不是很难,思维题,这个题目有几种情况要考虑,
第一个是存在1的情况,那么答案就是n-flag,flag表示1的数量。
第二个就是看他们的所有数gcd是不是等于1 如果不是那么就输出-1
第三个就是gcd==1 所以但是没有1 这个时候我们就可以找到每一个一段进行gcd==1 把所有的段都保存下来,然后求最小的数值让他gcd==1
找到之后就再加上n-1即可。
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <algorithm> #include <vector> #include <iostream> #define inf 0x3f3f3f3f using namespace std; const int maxn = 2e3 + 10; queue<int>que; int a[maxn]; int gcd(int a,int b) { return b == 0 ? a : gcd(b, a%b); } int main() { int n; scanf("%d", &n); int flag = 0; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); if (a[i] == 1) flag++; } if(flag) { printf("%d ", n - flag); return 0; } flag = 0; int ans = a[1]; int ax = a[1]; for(int i=2;i<=n;i++) { if (gcd(a[i], a[i - 1]) == 1) flag = 1; ans = gcd(ans, a[i]); ax = gcd(ax, a[i]); if(ans==1) { que.push(i); ans = a[i + 1]; } } if (flag) printf("%d ", n); else if (ax != 1) printf("-1 "); else { int an = inf; while(!que.empty()) { int num = 0; int u = que.front(); que.pop(); int ex = a[u]; u--; while(ex!=1) { ex = gcd(ex, a[u]); u--; num++; } an = min(an, num); } printf("%d ", n - 1 + an); } return 0; }