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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值