首页 > 其他分享 >cf908(div2)题解(补题)

cf908(div2)题解(补题)

时间:2023-11-08 18:35:36浏览次数:34  
标签:count int 题解 cin long ++ 补题 cf908 include

纪念这次div2让我上绿名,但还是有点遗憾,差一点就可以过三题超神了

比赛链接cf908div2

A

这题是个骗人题,整个比赛会停下来就是一个人赢够了回合数,那么在谁这停下来就是谁赢了整个比赛,不用管每回合赢得规则。

#include<iostream>
using namespace std;
#include<string>
int main()
{
	int t;
	cin >> t;

	while (t--)
	{
		int n;
		cin >> n;
		string s;
		cin >> s;

		int A = 0, B = 0;
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] == 'A')
			{
				A++;
			}
			else
			{
				B++;
			}
		}
		if (s[s.size() - 1] == 'A')cout << "A" << endl;
		else cout << "B" << endl;

	}
	return 0;

}

B

先从最简单的情况考虑,或者说分析一下给的三个条件必须正好满足两个是什么意思
如果序列为一个数a重复三次,那么要满足任意两个条件,都不可避免的同时满足了三个条件
那么自然想到,要将两个条件分配给两个数,让他们分别去实现其中一个条件,比如,有两个5,两个6,那么就可以给两个5分别赋值为1,2,给两个6分别赋值为1 3
那么,我们可以先明确不满足的情况是这样的:出现次数大于等于2的数字小于两个。
而如果出现次数大于等于2的数字大于两个,我们就可以任意找两个数字,找到他们的两次出现位置,分别赋值为1,2,和1,3,然后其他所有位置都是1,就一定满足。

#include<iostream>
#include<unordered_map>
#include<queue>
using namespace std;
const int maxn = 100020;
#include<vector>

int main()
{
	int t;
	cin >> t;

	while (t--)
	{
		int a[maxn] = { 0 };
		int b[maxn] = { 0 };
		
		int n;
		cin >> n;
		
		unordered_map<int, int>mp;                //记录每个数出现了多少次
		int count_2 = 0;                          //记录有多少个数出现次数大于等于2
		unordered_map<int, int>asdf;
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i];
			mp[a[i]]++;
			
		}
		for (int i = 1; i <= n; i++)
		{
			if (mp[a[i]] >= 2&&asdf.count(a[i])==0)
			{
				count_2++;
			
			}
			asdf[a[i]]++;
		}

		if (count_2 < 2)
		{
			cout << -1 << endl;
		}
		else
		{
			int firstnum = -1, secondnum = -1;
			int index = -1;
			for (int i = 1; i <= n; i++)
			{
				if (mp[a[i]] >= 2)
				{
					firstnum = a[i];
					index = i;
					break;
				}
			}
			for (int i = index + 1; i <= n; i++)
			{
				if (mp[a[i]] >= 2&&a[i]!=firstnum)
				{
					secondnum = a[i];
					break;
				}
			}

			int countfirst = 0, countsecond = 0;

			for (int i = 1; i <= n; i++)
			{
				if (a[i] == firstnum)
				{
					countfirst++;
					b[i] = countfirst;
					if (countfirst == 2)
					{
						break;
					}
				}
			}
			for (int i = 1; i <= n; i++)
			{
				if (a[i] == secondnum)
				{
					countsecond++;
					b[i] = countsecond;
					if (countsecond == 2)
					{
						b[i] = 3;
						break;
					}
				}
			}

			for (int i = 1; i <= n; i++)
			{
				if (b[i] == 0)
				{
					b[i] = 1;
				}

			}
			for (int i = 1; i <= n; i++)
			{
				cout << b[i] << " ";

			}
			cout << endl;
		}
		

		
	}

	return 0;

}

C

这题手动模拟几次可以发现,如果给的那个最终序列最后一个位置是x,那么它的上一个序列其实就是这个序列的后x位移动到序列前面,给定最终序列,那么如此反向操作k次,结果是唯一的。
如果中间发现这个最后一个数x>n,那么就说明不可能。
如果我们想模拟这个反向操作,可以把序列复制很多次,也可以用模运算,具体见代码:

#include<iostream>
using namespace std;
const int maxn = 200200;
#include<unordered_map>
#include<string>
#include<cstring>
long long a[maxn];
int main()
{
	int t;
	cin >> t;
	int tt = t;
	while (t--)
	{
		memset(a, 0, sizeof a);
		long long n, k;
		cin >> n >> k;
		
		for (int i = 0; i <n; i++)
		{
			cin >> a[i];
		}

		int flag = 1;
	    long long count = 0;
		unordered_map<long long, long long >num;
		for (long long i = n - 1; count <k;i=((i-a[i])+n)%n)           //count<k而不是<=k,因为要求是正好k次
		{
			if (a[i]>n)
			{
				
				flag = 0;
				break;
			}
			count++;
			if (num.count(i) != 0)                                     //遇到了重复下标,说明进入一个循环的过程了,就一定可以
			{
				flag = 1;
				break;
			}
			num[i]++;
		}
		if (flag == 1)cout << "Yes" << endl;
		else if(flag==0)cout << "No" << endl;

	}

	return 0;
}

分割线,赛时就想出来了这三道题,C题还因为<=k这个愚蠢bug没调出来,后面是补题,待更新

标签:count,int,题解,cin,long,++,补题,cf908,include
From: https://www.cnblogs.com/z4t15/p/17818034.html

相关文章

  • Qt - QWidget::setGeometry()不生效问题解决方案
    开发过程中经常碰到setGeometry()不生效的问题,发现只要在setGeometry()之前调用一下show()或者setVisible(true)就可以了!问题就出在setVisible(true)!!!setVisible()会判断当前控件的WA_WState_Created属性,意思就是看看控件是否已经创建了window,如果为没有创建,就调用create()方......
  • 第三方组件及计算属性传参的问题解决方式
    1.前言唉,好想玩滋嘣。2.计算属性直接传参接收不到表格数据某一列需要用的计算属性时,模板中使用计算属性fullName就会直接调用fullName函数,而在模板中fullName(item)相当于fullName()(item),此处为函数柯里化。<el-table-columnlabel="名称"align="center"min-width=......
  • Balance Addicts 题解
    BalanceAddicts题目大意给定序列\(a\),求有多少种合法的划分方案。定义一种划分方案是合法的当且仅当划分出的各段序列的和构成回文序列。思路分析一种不太一样的做法。我们先对\(a\)做一遍前缀和,得到\(s\)。观察各段序列的和形式:\[s_{p_1},s_{p_2}-s_{p_1},s_{p_3}......
  • P2146 [NOI2015] 软件包管理器 题解
    [NOI2015]软件包管理器题目背景Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debi......
  • 【洛谷 P4414】[COCI2006-2007#2] ABC 题解(排序)
    [COCI2006-2007#2]ABC题面翻译【题目描述】三个整数分别为。这三个数字不会按照这样的顺序给你,但它们始终满足条件:。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。【输入格式】第一行包含三个正整数,不一定是按这个顺序。这三个数字都小于或等于。第二行包......
  • 前端计算数字精度丢失问题解决方法记录 | 京东云技术团队
    在日常一些需求中,总会遇到一些需要前端进行手动计算的场景,那么这里需要优先考虑的则是数字精度问题!具体请看下面截图如图所示,在JavaScript进行浮点型数据计算当中,会出现计算结果“不正确”的现象。我们知道浮点型数据类型主要有:单精度float、双精度double。浮点型简单来说就是表示......
  • 23级ACM第二次招新测试题解
    A.lyynuu思路:先了解子序列的概念:在数学中,某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的新序列接下来我们就思考什么样的字符串可以让子序列lynu形成的数量最多,显然当相同字符连在一起时可以形成尽可能多的lynu,例如:llyy......
  • 题解 P4755 Beautiful Pair
    洛谷。题意显然。分析首先考虑到分治,那么问题就在于如何维护经过某个结点的方案数。利用从中间结点向两端的前缀后缀最大值,接下来我们对左端点的每一个结点考虑连向右侧的方案数。考虑分类讨论,令左端点为\(i\),右端点为\(j\)。假如\(mx_i>mx_j\),那么我们整个区间的最大......
  • 23级ACM实验室第一次招新测试题解
    A.还是HelloWorld?思路:无代码:c++:#include<bits/stdc++.h>usingnamespacestd;intmain(){ cin.tie(0)->ios::sync_with_stdio(0); cout<<"Hello,World!"<<endl; return0;}B.这题真不难,放轻松~思路:无代码:C++:#include<bits/st......
  • [ARC105E] Keep Graph Disconnected 题解
    题意给定一张由\(N\)个点和\(M\)条边组成的简单无向图\(G\),定义一个无向图是好的当且仅当这张图满足以下条件:\(1\)号节点和\(N\)号节点不联通图中不存在重边和自环现有两人轮流采取操作,每轮操作如下:选择两个点\(u,v\),将边\((u,v)\)加入图\(G\)中当一方无......