感觉每次做51NOD都要脑洞大开…. 显然 每次插入一个球 都要保证插入位置2边的球颜色种类数尽可能多 假设有2个堆 考虑插入x色球 如果哪个堆没有颜色为x的球 就插进哪个堆
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<string> #include<vector> #include<deque> #include<queue> #include<algorithm> #include<set> #include<map> #include<stack> #include<time.h> #include<math.h> #include<list> #include<cstring> #include<fstream> //#include<memory.h> using namespace std; #define ll long long #define ull unsigned long long #define pii pair<int,int> #define INF 1000000007 #define pll pair<ll,ll> #define pid pair<int,double> struct C{ C()=default; bool flag[3]={0,0,0}; int score=0;//可以获得的分数(颜色种数) void add(char ch){//插入ch颜色的球 ch-='0'; score+=1; flag[ch]=true; } bool check(char ch){//检查有没有ch颜色的球 return flag[ch-'0']; } }; int slove(char*s){ int n=strlen(s); if(n<=2) return n-1; for(int i=0;i<n;++i) s[i]=s[i]=='R'?'0':s[i]=='G'?'1':'2'; C c1,c2; c1.add(s[0]),c2.add(s[1]); int ans=1; for(int i=2;i<n;++i){ ans+=c1.score+c2.score; if(!c1.check(s[i])){ c1.add(s[i]); } else if(!c2.check(s[i])){ c2.add(s[i]); } } return ans; } int main() { //freopen("/home/lu/文档/r.txt","r",stdin); //freopen("/home/lu/文档/w.txt","w",stdout); int T; scanf("%d",&T); char s[55]; while(T--){ scanf("%s",s); printf("%d\n",slove(s)); } return 0; }