abc268C
abc268
题意:
有
现在, 你可以进行以下操作
- 将转盘逆时针旋转
\frac{1}{N} 圈。也就是说, 旋转前在第i 号人面前的盘子现在在(i+1)\bmod N 号人面前了。
当你结束操作后,如果第
请求出你最多能使多少人感到高兴。
思路:
因为让第
注意:取模会有负数要特判一下(
\texttt{My Code:}
#include <bits/stdc++.h>
using namespace std;
int n;
int a[200010], cnt[200010];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d", &a[i]);
for (int i = 0; i < n; ++i) {
cnt[(a[i] - 1 - i - 1 + n) % n]++;//转到i-1
cnt[(a[i] - 1 - i + n) % n]++;//转到i
cnt[(a[i] - i + n) % n]++;//转到i+1
}
int ans = 0;
for (int i = 0; i < n; ++i)
ans = max(ans, cnt[i]);
printf("%d\n", ans);
return 0;
}
\texttt{S08577} \texttt{Code} :
这个
#include<iostream>
#include<cstring>
using namespace std;
int a[200010],b[200010],c[200010];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
int t=a[i]-i;
if(t>=0) b[i]=t;
else b[i]=t+n;
c[b[i]]++;
}
int maxn=0;
for(int i=1;i<n;i++){
maxn=max(maxn,c[i-1]+c[i]+c[i+1]);
}
maxn=max(maxn,c[0]+c[1]+c[n-1]);
maxn=max(maxn,c[n-1]+c[n-2]+c[0]);
cout<<maxn;
return 0;
}
\texttt{addnine} \texttt{Code}
这里用max_element求得最大值。
#include <bits/stdc++.h>
using namespace std;
#define all(v) (v).begin(), (v).end()
using ll = long long;
using ld = long double;
int main() {
int N;
cin >> N;
vector<int> p(N), q(N);
for (int i = 0; i < N; i++) cin >> p[i];
vector<int> cnt(N, 0);
for (int i = 0; i < N; i++) {
int x = (p[i] + N - i) % N;
cnt[(x-1+N) % N]++;
cnt[x]++;
cnt[(x+1) % N]++;
}
cout << *max_element(all(cnt)) << endl;
return 0;
}