题目描述
我们知道,词都是按照词牌来填的,上帝为了考验小杉,只给了他四种词牌,但只要压韵就算符合词牌。
小杉已经想好了N个意境优美的句子,每个句子都有一个韵脚。
符合要求的词的句式应当有如下四种" XXYY" ," XYXY" ," XYYX" ," XXXX" ,其中X或Y表示韵脚。
现在小杉想知道,从他想的N个句子之中,最多能按顺序挑选出几首符合条件的词。
并且词的句子间不能交错,比如你选了1 4 6 8做为一首诗,那么7你就不能再选了。输入数据
每组测试数据的
第一行有一个数 N (N≤4000)。
第二行有N个不超10^{3}的正整数,第i个整数表示第i个句子的韵脚,整数相同表示韵脚相同。
30% 的数据 N≤100输出数据
对每组测试数据输出一行,仅有一个数字,表示小杉最多能挑出几首词来。
样例输入
12 1 2 4 2 3 1 2 2 1 1 2 2
样例输出
2
样例说明
样例最多可以挑出两首词,一种方案如下:
1 2 4 6/9 10 11 12
解析:
1、分析句式," XXYY" ," XYXY" ," XYYX" ," XXXX" ,可以观察到,在任意组句式中,都是由两对相同的韵脚组成,任意组合均可。
2、贪心策略:对于 n 个句子,从前往后搜索,当凑齐两对相同韵脚时,就组成一首诗。
为了不影响凑对(如,1 2 1 3 1 2),将配对成功的韵脚设置为0 。
为了避免两首诗存在交叉情况,设置起始点 start,每当组成一首诗时,更新搜索起始点。
完整代码:
#include<iostream> using namespace std; int a[4005]; int main(){ int n; cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; int pairs=0, ans=0, start=1; for(int i=1; i<=n; i++){ for(int j=start; j<i; j++){ if(a[j]==a[i]){ pairs += 1; a[i]=0;//表示已经和别人成对 a[j]=0; break; } } if(pairs==2){//找到两对相同韵脚的句子 pairs=0; ans += 1; start=i+1; //避免与后一首诗交叉 } } cout<<ans<<endl; return 0; }