Codeforces Round #741 (Div. 2)C Rings(思维)

题目大意:
给你t组数据
每组数据给你一个n代表字符串长度
然后给你一个01字符串
让你取这个字符串中两个区间并且二进制转化成10进制之后是倍数关系(并且第一个区间要比第二个区间的数大)(并且区间长度>=n/2)

思路:
因为0如果放一个二进制数前面其实无关紧要
而放后面就相当于乘2的关系
那直接找到0的位置
然后找一个区间包括这个0,一个区间不包括这个0,并且这两个区间取同一个方向
设0的位置为i
要不就是[1,i],[1,i-1]
要不就是[i,n],[i+1,n]
就除了0以外其他数都相同
而如果全是1的情况
那随便取两个区间大于等于n/2长度的就好了

AC代码:

#include <bits/stdc++.h>

using namespace std;
string s;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n>>s;
        int ok=1;
        for(int i=0;i<n;i++){
            if(s[i]=='0'){
                if(i>=n/2)cout<<1<<' '<<i+1<<' '<<1<<' '<<i;
                else cout<<i+1<<' '<<n<<' '<<i+2<<' '<<n;
                ok=0;
                break;
            }
        }
        if(ok)cout<<1<<' '<<n-1<<' '<<2<<' '<<n;
        cout<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值