首页 > 其他分享 >AtCoder ABC286 C - Chinese Restaurant

AtCoder ABC286 C - Chinese Restaurant

时间:2023-04-07 21:24:12浏览次数:51  
标签:AtCoder le return Chinese Restaurant int bmod 旋转 ABC286

AtCoder ABC286 C - Chinese Restaurant

题目描述

有 \(N\) 个人从 \(0\) 开始编号, 按逆时针顺序间隔均匀地坐在转盘周围。 在开始时, 第 \(p_i\) 盘菜在第 \(i\) 个人的前面。

现在, 你可以进行以下操作 \(0\) 次或多次。

  • 将转盘逆时针旋转 \(\dfrac{1}{N}\) 圈。也就是说, 旋转前在第 \(i\) 号人面前的盘子现在在 \((i + 1) \bmod N\) 号人面前了。

当你结束操作后,如果第 \(i\) 盘菜在第 \((i-1)\bmod N\) 个人、第 \(i\) 个人或第 \((i+1)\bmod N\) 个人面前,第 \(i\) 个人就会感到高兴。

请求出你最多能使多少人感到高兴。

样例输入输出

4
1 2 0 3
4

数据范围

\(3 \le N \le 2 \times 10^5\)

\(0 \le p_i < N\)

思路

如果枚举所有的桌子的状态,那么将会是 \(\Theta(N)\) 的复杂度,显然不可取。

如果我们将思维颠倒过来,从每个人的角度思考,这样显然简单很多。

定义 \(cnt_i\) 表示如果桌子旋转 \(i\) 次时的高兴人数,那么只需要统计 \(cnt\) 的最大值即可。

对于每一个人 \(p_i\),只要旋转了 \((i-1)\bmod N\)、 \(i\) 或 \((i+1)\bmod N\) 次后,就会让这个人高兴。因此枚举每一个人 \(p_i\),并将可以使它高兴的旋转次数自增 \(1\),最终求最大值即可。

代码

#include <iostream>
#include <unordered_map> 

using namespace std;

const int N = 2e5 + 10, inf = 0x3f3f3f3f;

int n, p[N], mx = -inf;

// 哈希表 
unordered_map<int, int> cnt;

// x 转到 y 的旋转次数 
int f(int x, int y){
	if(x == y){
		return 0;
	}
	if(x < y){
		return y - x;
	}
	return n - x + y;
}

signed main(){
	scanf("%lld", &n);
	
	for(int i=0; i<n; i++){
		scanf("%lld", p+i);
		// 将每种会使 p[i] 高兴的旋转次数全部加 1 
		cnt[f((p[i] - 1) % n, i)]++;
		cnt[f(p[i] % n, i)]++;
		cnt[f((p[i] + 1) % n, i)]++;
	}
	
	// 寻找最大值 
	for(auto e : cnt){
		mx = max(mx, e.second);
	}
	
	printf("%lld", mx);
	
	return 0;
}

标签:AtCoder,le,return,Chinese,Restaurant,int,bmod,旋转,ABC286
From: https://www.cnblogs.com/2huk/p/17297385.html

相关文章

  • AtCoder ABC295 D - Three Days Ago
    AtCoderABC295D-ThreeDaysAgo题目描述给出一个数字串,问有多少子段满足,可以以某种方式将这个子段重排,将子段分成两个完全相同的部分。样例输入输出202303224\((1,6)(1,8)(2,7)(7,8)\)都可以满足条件分析如果要满足某一个字段可以被分为两个相同的部分,则不......
  • AtCoder ABC294 F - Sugar Water 2
    AtCoderABC294F-SugarWater2题意有\(2\)排糖和水。第\(1\)排有\(N\)瓶糖和\(N\)瓶水。糖分别有\(A_i\)克,水分别有\(B_i\)克。第\(2\)排有\(M\)瓶糖和\(M\)瓶水,糖分别有\(C_i\)克,水分别有\(D_i\)克。若要从第\(1\)排糖水中找到\(A_i\)克糖和......
  • AtCoder Beginner Contest 226(E,F,G)
    AtCoderBeginnerContest226(E,F,G)E(并查集)E这个题的大意是给我们一个无向图,我们可以把这些无向边变成有向边,让每一个点的入度都是\(1\),问有多少种变化方式要让有\(x\)个点的无向图,形成一棵树的边的数量是\(x-1\),但是我们需要的是每一个点的入度为\(1\),那么我们只还需要一条......
  • AtCoder Regular Contest 158 D - Equation
    题目链接原本看着式子直接晕了,觉得是高深的硬核数论,于是放弃(然后E也没想出来,sad)关键的思路在于,考虑构造由(a,b,c)->(ta,tb,tc)这样的求解方式。在看到这个做法后,会发现它很好地利用了题目齐次的性质;至于如何由齐次式想到这个做法,可能需要足够的天赋或者经验吧(悲)化简后得到\(At......
  • AtCoder Beginner Contest 296
    AtCoderBeginnerContest296比赛连接好久没写题解了~~D-M<=ab题意就是给定N,M,求一个最小的数x同时满足x>=M且x=a*b(a<=N,b<=N);N,M<=1e12开始脑瘫想了二分,仔细一想很明显x不满足单调性,想了下暴力的时间复杂度巨大...纠结了一会,发现因子最大是sqrt(m),只需要枚举一下因......
  • AtCoder Beginner Contest 144
    AtCoderBeginnerContest144https://atcoder.jp/contests/abc144补一下3.23做的。D-WaterBottle分类讨论,三角函数。#include<bits/stdc++.h>#definepiacos(-1)usingnamespacestd;intmain(){inta,b,x;cin>>a>>b>>x;......
  • AtCoder Beginner Contest 296 A-E
    AtCoderBeginnerContest296A-Alternately1voidsolve(){2intn=read();3strings;4cin>>s;5intans=1;6for(inti=0;i<s.size()-1;i++){7if(s[i]==s[i+1])ans=0;8}9puts(ans>0?"Yes&......
  • AtCoder Beginner Contest 296
    AtCoderBeginnerContest296赛时代码A-Alternately//Problem:A-Alternately//Contest:AtCoder-AtCoderBeginnerContest296//URL:https://atcoder.jp/contests/abc296/tasks/abc296_a//MemoryLimit:1024MB//TimeLimit:2000ms////PoweredbyCP......
  • AtCoder Beginner Contest 153
    AtCoderBeginnerContest153https://atcoder.jp/contests/abc153这套比较简单。E-CrestedIbisvsMonster完全背包#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=1e3+5,M=1e4+5;lln,m,a[N],b[N],f[M*2],mx;int......
  • AtCoder Beginner Contest 296
    DM<=ab枚举。复杂度\(O(\sqrt{m})\)。C++Code#include"bits/stdc++.h"usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);i64n,m;cin>>n>>m;if(m&......