首页 > 其他分享 >洛谷P8471 [Aya Round 1 F] 琪露诺的选择题

洛谷P8471 [Aya Round 1 F] 琪露诺的选择题

时间:2023-02-23 20:24:38浏览次数:56  
标签:洛谷 正确 错误 int Aya 露诺 答案 字符串 长度

原题传送门

题目描述

有 2⋅n 道选择题,每题有 A 和 B 两个选项。正确答案可以表示为一个长度为 2⋅n 的字符串。

现在你要构造出一份作答(长度同样为 2⋅n 的字符串),其中恰好有 a 个 A,同时与正确答案相比,你的作答恰好有 e 个错误。如果不存在这样的构造方案,报告无解。

注意:为了方便处理,本题保证 e≤n。

形式化地,给定 n,a,e 和一个长度为 2⋅n 的 01 串 s,你需要构造出一个恰好有 a 个字符是 0 的长度为 2⋅n 的 01 串 p,使得

其中 [] 是 Iverson Bracket,详见「提示/说明」中的「提示」。


输入格式

本题含有多组数据。

  • 第一行输入一个整数 T,表示数据组数。
  • 对于每组数据:
    • 第一行输入三个整数 n,a,e。
    • 第二行输入一个长度为 2⋅n 的字符串,表示答案串。

输出格式

  • 输出共T行
  • 对于每组数据:
    • 若有解,输出一行一个长度为 2⋅n 的字符串,表示你构造的作答串。
    • 若无解,输出一行一个字符串 -1。

说明/提示

数据规模与约定

对于 100% 的数据,有 1≤T≤100,1≤n≤105 ,0≤e≤n,0≤a≤2⋅n。

单组测试点内保证 ∑(2⋅n)≤106

提示

A. Iverson Bracket
Iverson Bracket,是一种用方括号记号,如果方括号内的条件满足则为 1,不满足则为 0。更确切地讲,
.


题目理解

题目需要求有两个

  1. a个A的同时
  2. 有e个错误

大致思路先求出答案串里的"A"和"B"的数量,先按照所需的要求将一定数量的"A"转成"B"或者把一定数量的"B"转成"A",来满足第一个要求,每改变一个就要记录错误数量加一。
为了满足第二个条件,我们需要根据情况来选择:

  1. 将一个正确的"A"改成"B",将一个正确的"B"改成"A",可以做到增加两个错误
  2. 将一个错误的"A"改成"B",将一个错误的"B"改成"A",可以做到减少两个错误

通过商量两个步骤我们发现一次操作会改变两个错误数量,所以在第一步统计完成之后就对已有错误数量与需要的错误数量对比,如果差值的绝对值是奇数则不可能完成,直接输出-1


上C++代码

#include<bits/stdc++.h>
using namespace std;

int t;
char x[2000005];                                        //记录正确答案
char y[2000005];                                        //修改答案
int n, a, e;
bool z[2000005] = { 0 };				//判断对错

int main()
{
	std::ios::sync_with_stdio(false);               //提高输入输出效率
	cin >> t;                                       //t组数据
	while (t--) {
		int wa = 0;
		int A = 0;
		int B = 0;
		cin >> n >> a >> e;
		memset(x, 0, sizeof(x));
		memset(y, 0, sizeof(y));
		memset(z, 0, sizeof(z));
		for (int i = 1; i <= 2 * n; i++) {
			cin >> x[i];
			y[i] = x[i];
			if (x[i] == 'A') A++;            //记录正确答案的A与B的数量
			else B++;
		}

		if (A < a) {                            //正确答案的A少于需要的A
			int h = a - A;
			int flag = 0;
			for (int i = 1; i <= 2 * n; i++) {
				if (y[i] == 'B' && flag < h) {
					y[i] = 'A';
					wa++;
					A++;
					z[i] = 1;
					flag++;
				}
				if (flag == h) break;
			}
		}
		else if (A > a) {                         //正确答案的A大于需要的A
			int h = A - a;
			int flag = 0;
			for (int i = 1; i <= 2 * n; i++) {
				if (y[i] == 'A' && flag < h) {
					y[i] = 'B';
					wa++;
					A--;
					z[i] = 1;
					flag++;
				}
				if (flag == h) break;
			}
		}

		if ((abs(wa - e)) % 2 == 1)  cout << -1;    //如果不能完成直接输出-1

		else {                                      //通过步骤2调整错误数量
			int h = abs(wa - e) / 2;
			int flag1 = 0;
			int flag2 = 0;
			if (wa > e) {

				for (int i = 1; i <= 2 * n; i++) {
					if (z[i] == 1 && y[i] == 'A' && flag1 < h) {
						y[i] = 'B';
						z[i] = 0;
						flag1++;
						continue;
					}
					if (z[i] == 1 && y[i] == 'B' && flag2 < h) {
						y[i] = 'A';
						z[i] = 0;
						flag2++;
						continue;
					}
					if (flag1 == h && flag2 == h) {
						wa = e;
						break;
					}
				}
			}
			else if (wa < e) {
				for (int i = 1; i <= 2 * n; i++) {
					if (z[i] == 0 && y[i] == 'A' && flag1 < h) {
						y[i] = 'B';
						z[i] = 1;
						flag1++;
						continue;
					}
					if (z[i] == 0 && y[i] == 'B' && flag2 < h) {
						y[i] = 'A';
						z[i] = 1;
						flag2++;
						continue;
					}
					if (flag1 == h && flag2 == h) {
						wa = e;
						break;
					}
				}
			}
			if (flag1 != h || flag2 != h) cout << -1;      //如果数量不足以满足需要的错误数量,就直接输出-1
			else for (int i = 1; i <= 2 * n; i++) cout << y[i];    //输出答案
		}
		cout << endl;

	}

	return 0;                //结束!
}

标签:洛谷,正确,错误,int,Aya,露诺,答案,字符串,长度
From: https://www.cnblogs.com/waibiwaibii/p/17149004.html

相关文章

  • AcWing356/洛谷P4180 次小生成树
    涉及知识点:最小生成树,倍增题意题目链接(洛谷)题目链接(AcWing)题目写的很清楚,给定一张N个点M条边的无向图,求无向图的严格次小生成树。设最小生成树的边权之和为sum,严格次......
  • 【鼠】安卓学习杂记(二十三)——Android之Adapter之ArrayAdapter(数组适配器——无需写
    一、效果图二、XML代码<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_wi......
  • 如何在Maya中快速实现Bubble材质效果?
    Hello,大家好,今天给大家带来如何在Maya中快速实现Bubble材质效果?创建一个球体模型,并进行一次细分。再创建一个PhyiscalSky。给模型赋予一个AiStandardSurface材质球,并......
  • 「题解」洛谷 P5829 【模板】失配树
    crashednb/se不过它解释为什么跳\(k\bmodd+d\)确实有点迷,不懂为什么直接跳\(k\bmodd\)会挂可以手摸一下峰峰峰的hack,从25开始跳。简单做法就是建出失配树然后......
  • 洛谷P2341/USACO03FALL 受欢迎的牛
    题意分析题目链接喜欢是单向的,喜欢有传递性……Emmm这听起来好像……对了,就是连通性问题!我们不妨将奶牛之间的喜欢关系表示为一条条单向边,怎么求明星奶牛的数量呢?这里......
  • 洛谷P3694 邦邦的大合唱站队
    题目分析首先我们来抓题目里的关键信息:最少、M≤20那么由此得出做法就是DFS、贪心或DP,我们一一讨论DFS暴搜复杂度\(O(m!)\),只能过70%(70%它不香吗)贪心如果要贪心我......
  • [洛谷P3959][NOIP2017提高组] 宝藏
    [NOIP2017提高组]宝藏题目描述参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了\(n\)个深埋在地下的宝藏屋,也给出了这\(n\)个宝藏屋之间可供开发的\(m\)条道......
  • [洛谷P5368] 真实排名
    [PKUSC2018]真实排名题目描述小C是某知名比赛的组织者,该比赛一共有\(n\)名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括......
  • 洛谷 P1223 排队接水
    原题链接题解C++存在一种pair类型,并且可以指定first/second的数据类型,所以可以使用它来代替只有两个元素的结构体利用sort对数据进行排序,将取水时间从小到大排序为什......
  • 洛谷 P2240 部分背包问题
    原题链接题解这道题是贪心只要按照性价比最高的取一定得到的价值最大性价比就是这堆金币的价值除以重量只需要把这些金币按性价比排序就行了最后在超出和未超出之间......