CodeForces 590A

题意:给你一个含有n个数的数组a,a的值只有0和1;有一个变换规则的到数组b,规则为:

1) b[1]=a[1],b[n]=a[n];

2) b[i]=中位数(a[i-1],a[i],a[i-1]);

b数组继续变换下去,直到得到的数组与原数组一样,输出需要经过几次变换,如果无解则输出-1;

题解:此题没有无解的情况,可以看出数组中只有出现如下两种情况可以变换

1 0 1 -->1 1 1

0 1 0 -->0 0 0

因此,只要从起点s开始往后寻找到一个终点e,使得a[e]=a[e+1]或者e=n,s到e这一段的最终结果就可以求出来,结果如下:

1)a[s]=a[e]  s到e这段均为a[s];

2) a[s]!=a[e]  s到mid为a[s], mid+1到e为a[e] (mid=(s+e)/)2;

步骤均为(s+e)/2-s;

如下例子

原数组  0 1 0 1 0

第一步  0 0 1 0 0

第二部  0 0 0 0 0

step=(5+1)/2-1=2;

因此可以把a数组划分为多个如上的数组,取其中一个的步骤最大值即可,具体看代码:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int a[500000];
int b[500000];

int solve(int l,int r)
{
    if(l==r) return 0;
    if(a[l]==a[r])
    {
        for(int i=l;i<=r;i++)
            a[i]=a[l];
    }
    else
    {
        int mid=(l+r)/2;
        for(int i=l;i<=mid;i++)
            a[i]=a[l];
        for(int i=r;i>mid;i--)
            a[i]=a[r];
    }
    return (l+r)/2-l;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int s=0,ans=0;
    for(int i=0;i<n;i++)
    {
        if(a[i]==a[i+1] || i==n-1)
        {
            ans=max(ans,solve(s,i));
            s=i+1;
        }
    }
    printf("%d\n",ans);
    for(int i=0;i<n-1;i++)
        printf("%d ", a[i]);
    printf("%d\n", a[n-1]);
    return 0;
}
时间: 2024-08-09 06:24:10

CodeForces 590A的相关文章

CodeForces 590A Median Smoothing

A schoolboy named Vasya loves reading books on programming and mathematics. He has recently read an encyclopedia article that described the method of median smoothing (or median filter) and its many applications in science and engineering. Vasya like

Codeforces Round #327 (Div2)

CodeForces 591A 题意:在距离为L的两端A,B,相向发射魔法,a(以P1的速度)-->B,A<--b(以P2的速度).假设a-->B,途中相遇,则返回到原点A<--a. 后又继续,a-->B,速度不变. b亦是如此.求第二次相遇时a的位移. 思路:因为速度不变,所以第二次相遇地点与第一次相遇地点一样. res= n/(Va+Vb)*Va 代码: 1 #include <iostream> 2 #include <cstdio> 3 #in

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #408 (Div. 2) B

Description Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from 1 to n, placed along the x-axis on a table that has m holes on it. More precisely, cup i is on the table at the position x?=?i. The probl