您现在的位置是:首页 >学无止境 >JoJo‘s Incredible Adventures网站首页学无止境

JoJo‘s Incredible Adventures

bu_xiang_tutou 2023-07-11 08:00:02
简介JoJo‘s Incredible Adventures

题目:

题意解析:

这个题目是要求找出输入的字符串,,字符串的循环移位sk右边是字符串Sn−k+1...Sn,S1,S2...Snk。直到所有的字符,都循坏出现在字符串的开头,然后输入1形成的长方形的最大个数。

题解:

(1)这个题目你首先要找到,在输入的字符串中找到最长的连续的1字符串的长度。我的处理是将输入的字符串a,变成2a,求出2a的最长的1的字符的长度ans。

(2)找到最长的1的字符的长度ans:

        <1>这里要特别判断一下,如果ans的长度等于字符串的长度,就输入a字符串的长度的平方。

        <2>对于其他的情况,这里进行一个推算:

        

        当ans为偶数的时候,+1与没有加一结果相同,我在这里判断一下ans是否为奇数。当然也可以不判断,直接加就行了。上面推导的公式,可以用很多种形式表示,不一定就是我写的这种。但是规律是唯一的

 

代码:

#include<bits/stdc++.h>
#include<cmath>
using namespace std;
int t;
int main() {
	cin>>t;
	getchar();
	while(t--) {
		string a,c;
		cin>>a;
		a+=a;
		// 得到最长连续的1的长度
		long long int ans=0;
		for(int i=0; i<a.size(); i++) {
			if(a[i]=='1') {
				long long int k=1;
				i=i+1;
				while(a[i]=='1'&&i<a.size()) {
					k++;
					i++;
				}
				ans=max(ans,k);
				i-=1;
			}
		}
		if(ans==a.size()) {
			ans/=2;
			cout<<ans*ans<<endl;
		} else {
			long long int t=ans/2;
			if(ans%2==1) {
				t++;
			}
			long long int sum=(ans-t+1)*t;
			cout<<sum<<endl;
		}
	}
	return 0;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。