首页 > 其他分享 >AtCoder Beginner Contest 271赛后总结

AtCoder Beginner Contest 271赛后总结

时间:2022-10-02 11:45:16浏览次数:75  
标签:章节 AtCoder Beginner Contest ++ box long flag ans

3. C - Manga

题目大意:

给出一本书的部分章节(数量n),当我们读取章节时,我们从1开始读并且按照顺序读取,如果某一个章节读取不了,那么就停止。现在我们有一种操作,可以将两个已有的章节换成一个没有的章节,请问最多能读取到第几章节。

 

题目分析:

我们看到题目以后,我们可以发现我们需要卖掉一些不需要的章节,换取一些可以使读取数增加的章节,那么通过分析我们得到两个规律:

  1. 我们最多可以读到n个章节
  2. 重复的章节没有用处

章节数大于n的章节和重复的章节就一定可以被卖掉,为了更好的分析,所以我们可以先将这些没用的章节换成有用的章节

for (int i = 1; i <= n; i++)
{
int x;
    cin >> x;
    if (x <= n && box[x] == 0)
        box[x] = 1;
    else
        flag++;
}//统计有多少一定可以卖掉的章节
for (int i = 1; i <= n; i++)
{
    if (box[i] == 0 && flag >= 2)
    {
        box[i] = 1;
        flag -= 2;
    }
}//把卖掉的章节换成新章节

 

换完我们发现我们还有部分章节是没办法读取的,这是我们就需要卖掉一部分, 由于我们读取章节是从小到大的顺序,所以我们可以从章节数较大的开始卖,注意的是每买一本新的章节以后我们要判断一下这个新的章节是否和下一个章节连在一起。当我们没办法继续卖的时候,答案出来了

for (int i = n; i > ans; i--)
{
	if (box[i] == 1)
	{
		flag++;
		box[i] = 0;
	}//从后往前卖章节,如果卖掉就把box[i]变为0(防止被连起来,而被算进答案)
	if (flag == 2)
	{
		ans++;
		box[ans] = 1;
		flag = 0;
	}//当卖掉两个章节,就可以买新的章节
	while (box[ans + 1] == 1)
	{
		ans++;
		if (ans == n)break;
	}//检查新买的章节有没有连到下一本
}

 全部代码:

#include<stdio.h>
#include<iostream>
using namespace std;
int  box[200000000];
int main()
{
	long long n;
	long long ans = 0;
	long long flag = 0;
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		if (x <= n && box[x] == 0)
			box[x] = 1;
		else
			flag++;
	}//统计有多少一定可以卖掉的章节

	for (int i = 1; i <= n; i++)
	{
		if (box[i] == 0 && flag >= 2)
		{
			box[i] = 1;
			flag -= 2;
		}
	}//把卖掉的章节换成新章节

	for (int i = 1; i <= n; i++)
	{
		if (box[i] == 1)
		{
			ans++;
		}
		else
		{
			break;
		}
	}//算出目前可以读取到的章节数

	for (int i = n; i > ans; i--)
	{
		if (box[i] == 1)
		{
			flag++;
			box[i] = 0;
		}//从后往前卖章节,如果卖掉就把box[i]变为0
		if (flag == 2)
		{
			ans++;
			box[ans] = 1;
			flag = 0;
		}
		
		while (box[ans + 1] == 1)
		{
			ans++;
			if (ans == n)break;
		}//检查新买的章节有没有连到下一本
	}

	cout << ans << endl;
	return 0;
}

 

标签:章节,AtCoder,Beginner,Contest,++,box,long,flag,ans
From: https://www.cnblogs.com/BlueTeas/p/16748477.html

相关文章

  • Weekly Contest 312
    WeeklyContest312ProblemASortthePeople思路水题,按值排序就行代码classSolution:defsortPeople(self,names:List[str],heights:List[int])->List[......
  • The 2022 ICPC Asia Regionals Online Contest (II)部分题解
    ......
  • 洛谷 P2419 [USACO08JAN]Cow Contest S(最短路:floyed)
    https://www.luogu.com.cn/problem/P2419题目大意:给定n头奶牛(1<=N<=100),按1..N依次编号。m轮:两两之间进行对决,赢了的排在左边,输了的排在右边。我们想知道奶牛们编......
  • AtCoder Beginner Contest 266
    AtCoder五十连练第三练AtCoderBeginnerContest266D-SnukePanic(1D)高桥正试图抓住许多Snuke。有五个坑在坐标\(0,1,2,3,4\)号线,连接到Snuke的巢。现在,\(......
  • AtCoder ABC 270 题解(D-F)
    AtCoderABC270题解(D-F)D-Stones(博弈DP)题目:​ 现在有一堆石子,一个序列a表示每次可以从石头里拿走多少个石子。当无法再拿出石头的时候,游戏结束。两边都以最佳策略......
  • AtCoder Beginner Contest 256
    AtCoder五十连练第二练AtCoderBeginnerContest256D-UnionofInterval给定\(N\)个左闭右开的区间,求这些区间的并集。数据范围:\(1\leN\le2\times10^5\)......
  • AtCoder Beginner Contest 270 G,Ex
    y1s1,G和Ex在推等比数列式子上是相似的。G前置知识:BSGS(其实就是根号讨论)首先我们展开这个递归式:\[X_{i}\equivA^{i}S+\sum_{j=0}^{i-1}A^jB\modP\]感觉第一项有......
  • The 2022 ICPC Asia Regionals Online Contest (II) B
    BNon-decreasingArray我们可以知道两个操作都是一样的那我们直接记dp[i][j]为前i个数选了j个数并且以ai为结尾的max状态转移直接枚举dp[k][j-1]+(a[i]-a[k])^2即可......
  • Atcoder试题乱做 Part2
    感受下来,思维难度有参差,所以还是可以做的,虽然有的题和中国赛题差距有点大,但是无伤大雅?新的\(\text{Part}\)我要自己做出来更多题!\(\text{[AGC014D]Blackan......
  • Atcoder试题乱做 Part4
    时光怎不经一生浮浮沉沉已半生一壶浊酒欲随风一步一瞥似惊鸿情字要如何追问一指兰花为谁挽留\(\text{[ARC147D]SetsScores}\)\(\color{green}{\text{[EASY]}}\)......