本文共 790 字,大约阅读时间需要 2 分钟。
题目
东东和他的女朋友(幻想的)去寿司店吃晚餐(在梦中),他发现了一个有趣的事情,这家餐厅提供的 n 个的寿司被连续的放置在桌子上 (有序),东东可以选择一段连续的寿司来吃 东东想吃鳗鱼,但是东妹想吃金枪鱼。核 平 起 见,他们想选择一段连续的寿司(这段寿司必须满足金枪鱼的数量等于鳗鱼的数量,且前一半全是一种,后一半全是另外一种)我们用1代表鳗鱼,2代表金枪鱼。 比如,[2,2,2,1,1,1]这段序列是合法的,[1,2,1,2,1,2]是非法的。因为它不满足第二个要求。 东东希望你能帮助他找到最长的一段合法寿司,以便自己能吃饱。 Input 输入:第一行:一个整数n(2≤n≤100000),寿司序列的长度。
第二行:n个整数(每个整数不是1就是2,意义如上所述)
Output 输出:一个整数(代表东东可以选择的最长的一段连续的且合法的寿司)题目解析
要找到最长的那段区间,也就是说本题就是给你一个序列,比如1 1 2 2 1 1 1 2 2 2你会很容易发现选最后那6个是最长的,就是选一半连续的1,一半连续的2,1和2个数相等,不分孰前孰后最后输出总长度,那么怎么找涅?用s1记录1长度,s2记录2的长度,s1和s2选取长度最小那个作为标准长度,然后继续找,找出满足上述条件(半1半2)长度最长的标准长度。代码如下
Codes
#includeusing namespace std;const int maxn=1e5+10;int main(){ int n,a[maxn],ans=0,s1=0,s2=0,s=0,f1=0,f2=0; cin>>n; for(int i=0;i >a[i]; if(a[0]==1) f1=s1=1; else if(a[0]==2) f2=s2=1; for(int i=1;i
转载地址:http://gdwzi.baihongyu.com/