C-Movie Critics
- 题意
有n部电影,这些电影有k类。如果一直看一种电影不会增加情绪值,如果突然换了另一类电影会增加情绪值。问去掉哪一类电影可以使这个人情绪值最小。
- 思路
先考虑暴力做法,直接两个for循环嵌套暴力求出每一类电影产生的情绪值,取最小值。但这样是 1 0 5 ∗ 1 0 5 10^5*10^5 105∗105肯定TLE了。
于是我们可以这样考虑,一边遍历一边求每个电影产生情绪值,我们不难发现如果一个电影的前一个电影和后一个电影种类相同,连在一起就不会增加情绪值,也就是去掉当前这个电影情绪值会-2,如果左右电影不同,那自然情绪值只会-1。利用此规律我们可以求出每一类的电影的情绪值,但在此之前我们需要做一个区间合并,把连续的同类电影只记录一次,道理也很简单因为1 1 1情绪值不会增加,但按照上面的规律左右相同会导致 a [ 1 ] + 2 a[1]+2 a[1]+2。
- 代码
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 1e5 + 10;
int a[N],cnt[N];
int n,k;
int main() {
int maxn = 0;
int ans = 0;
int l = 1;
int temp;
cin >> n >> k;
for(int i = 1;i <= n;i++) {
scanf("%d", &temp);
if(temp != a[l - 1]) {
a[l++] = temp;
}
}
for(int i = 1;i <= l - 1;i++) {
if(a[i - 1] == a[i + 1]) {
cnt[a[i]] += 2;
}
else {
cnt[a[i]]++;
}
}
maxn = cnt[1];
ans = 1;
for(int i = 2;i <= k;i++) {
if(cnt[i] > maxn) {
maxn = cnt[i];
ans = i;
}
}
cout << ans << endl;
return 0;
}