The handling of CCA (reverse thinking + greedy + simulation)

https://ac.nowcoder.com/acm/contest/11168/B


Ideas:

Considering the reverse, then the order from back to front is the order of the stack, with 1 first, 2 on top of 1, and 3 on top of 2. This order is also optimal. This order is in the order of input.

Why is it right to consider being so greedy? Try to change the two adjacent positions, you can find that the total weight of the movement will not decrease.

A detail of the simulation:

Everyone knows that it breaks when encountering the original number that has appeared. But be careful to count the number that has appeared before, otherwise the number below may count as more balls with the same number. (God knows how long it has been since I didn't expect wa here)

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e3+100;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
LL a[maxn],tot=0;
LL val[maxn];
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL n,m;cin>>n>>m;
  for(LL i=1;i<=n;i++) cin>>val[i];
  LL sum=0;
  for(LL i=1;i<=m;i++){
    LL x;cin>>x;
    bool flag=1;
    multiset<LL>s;
    for(LL j=tot;j>=1;j--){
        if(s.count(a[j])) continue;
        s.insert(a[j]);
        if(a[j]==x){
            flag=0;
            a[++tot]=x;
            break;
        }
        else sum+=val[a[j]];
    }
    if(flag==1) a[++tot]=x;
  }
  cout<<sum<<"\n";
return 0;
}

 

Guess you like

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/114767746