Coderforce题解

C. Movie Critics

题意:
Valentine在想要去看电影,总共n场电影,每场电影都有一个对应的genre值x (1 <=x <=k),但是Valentine不想把所有的电影都看完,他想把其中某些genre值=x的电影去掉,只看剩下的电影,但是还有一个问题:就是每场电影的时间是固定的,所以他必须按顺序来观看,当上一场电影的genre值与下一场的genre值不一样的时候,Valentine的愤怒值就会+1(初始为0),题目要求出去掉genre值为x的电影后,他的愤怒值最小的x。
思路:

贪心的算法,假设他的愤怒值为Max,去掉后为y,那么就是让我们求Max-y的值最大的那个x。让我们来看一个例子:1 2 3,假设要去掉的x=2,根据题目的描述,去掉2后两边的电影值还是不同,所以这样他的总愤怒值Max应该-1,下一个例子:2 3 2,同样去掉3之后,发现两边的电影值相同,那么他的愤怒值应该-2。
优化:

出现相邻germ相等时,eg1 3 3 2,可以去掉3的同时去掉相邻3,优化代码时可将重新创建数组保存优化的数据

<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000000+5;
int s[maxn];
int Min[maxn];
int main()
{
    int n,k;
    while(cin>>n>>k)
    {
        memset(Min,0,sizeof(Min));
        int t=1;
        s[0]=0;
        int x;
        for(int i=1;i<=n;i++)
        {
             scanf("%d",&x);
             if(x!=s[t-1])
            s[t++]=x;
        }
        s[0]=s[t]=0;
        for(int i=1;i<t;i++)
        {
            if(s[i-1]==s[i+1])
                Min[s[i]]+=2;
            else
                Min[s[i]]+=1;
        }
        int pos=1;
        for(int i=2;i<=k;i++)
            if(Min[i]>Min[pos])
              pos=i;
        cout<<pos<<endl;
      }
    return 0;
}

 
 


你可能感兴趣的:(Coderforce题解)