Codeforces 1138B Circus (构造方程+暴力)

本文提出了一种解决两个01串匹配问题的策略,通过计算00011011四种组合的出现次数,设计了a,b,c,d四个变量来匹配这些组合,最终实现了在n/2位置上,两个字符串中1的数量相等的目标。

题意:

给你两个01串,要你选n/2个位置,使得选的位置在s1中"1"的数量等于未选的s2中"1"的数量

n<=5000,1s

思路:

设两个串中出现"00""01""10""11"的总数是A,B,C,D,我们选的个数分别是a,b,c,d

数据最多能承受n^2的暴力

根据题意,有a+b+c+d=n/2     ①

c+d=B-b+D-d    ②

联立得d=B+D+a-n/2

于是我们暴力a,可以得到d

然后将a,d带入①可得b+c=n/2-a-d

暴力b可得c

最后只要a,b,c,d是否全部合法,输出方案即可

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
#include<cmath>
    
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
//#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) 

using namespace std;

typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;

const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 2e6+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;


int n;
char s1[maxn];
char s2[maxn];
int A,a,B,b,C,c,D,d;
int main(){
    scanf("%d", &n);
    scanf("%s", s1+1);
    scanf("%s", s2+1);
    for(int i = 1; i <= n; i++){
        if(s1[i]=='0'){
            if((s2[i]=='0'))A++;
            else B++;
        }
        else{
            if(s2[i]=='0')C++;
            else D++;
        }
    }
    int mm = min(A, n/2);
    a = b = c = d = -1;
    int ys = 0;
    for(a = 0; a <= A && a <= n/2; a++){
        if(B+D-n/2+a<=D&&B+D-n/2+a>=0){
            d = B+D-n/2+a;
            //int m = min(min(n/2-a-d,B),n/2);
            //printf("%d %d\n",a,d);
            for(b = 0; b <= B&&b<=n/2-a-d; b++){
                //printf("  %d\n",b);
                if(n/2-a-b-d<=C&&n/2-a-b-d>=0){
                    c = n/2-a-b-d;
                    ys=1;break;
                }
            }
            if(ys)break;
        }
    }
    //printf("%d %d %d %d\n", a,b,c,d);
    if(!ys){
        return printf("-1"),0;
    }
    for(int i = 1; i <= n; i++){
        if(s1[i]=='0'){
            if(s2[i]=='0'&&a){
                a--;
                printf("%d ",i);
            }
            else if(s2[i]=='1'&&b){
                b--;
                printf("%d ",i);
            }
        }
        else if(s1[i]=='1'){
            if(s2[i]=='0'&&c){
                c--;
                printf("%d ",i);
            }
            else if(s2[i]=='1'&&d){
                d--;
                printf("%d ",i);
            }
        }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/10505395.html

当前提供的引用内容并未提及关于Codeforces比赛M1的具体时间安排[^1]。然而,通常情况下,Codeforces的比赛时间会在其官方网站上提前公布,并提供基于不同时区的转换工具以便参赛者了解具体开赛时刻。 对于Codeforces上的赛事而言,如果一场名为M1的比赛被计划举行,则它的原始时间一般按照UTC(协调世界时)设定。为了得知该场比赛在UTC+8时区的确切开始时间,可以遵循以下逻辑: - 前往Codeforces官网并定位至对应比赛页面。 - 查看比赛所标注的标准UTC起始时间。 - 将此标准时间加上8小时来获取对应的北京时间(即UTC+8)。 由于目前缺乏具体的官方公告链接或者确切日期作为依据,无法直接给出Codeforces M1比赛于UTC+8下的实际发生时段。建议定期访问Codeforces平台查看最新动态更新以及确认最终版程表信息。 ```python from datetime import timedelta, datetime def convert_utc_to_bj(utc_time_str): utc_format = "%Y-%m-%dT%H:%M:%SZ" bj_offset = timedelta(hours=8) try: # 解析UTC时间为datetime对象 utc_datetime = datetime.strptime(utc_time_str, utc_format) # 转换为北京时区时间 beijing_time = utc_datetime + bj_offset return beijing_time.strftime("%Y-%m-%d %H:%M:%S") except ValueError as e: return f"错误:{e}" # 示例输入假设某场Codeforces比赛定于特定UTC时间 example_utc_start = "2024-12-05T17:35:00Z" converted_time = convert_utc_to_bj(example_utc_start) print(f"Codeforces比赛在北京时间下将是:{converted_time}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值