hdu 4928 Series 2 (优化+模拟)

来源:互联网 发布:mysql binlog 编辑:程序博客网 时间:2024/06/11 20:34

题意:

一个含n个数的序列a,每两个相邻的数相减得到一个新数,这些数组成一个新的序列。

如果所有得到的序列都满足非严格的单调性,则原序列为nice series;如果给出的序列

本来不满足单调性,它是ugly series。否则输出k,表示前k个序列都满足单调性,第k+1不满足。


算法:

模拟合并和判断单调性,如果不优化会Tle.

如果去掉前导0和后导0,因为0-0还是0,省去一部分操作。

但是为了避免得到的下一个序列的判断有误,应该前后各留一个0.

比如:

7

1 1 1 3 5 7 9

第一次变换得到 0 0 2 2 2 2 -->满足单调性

第二次 如果完全忽略前导0 则下一个序列变为 0 0 0

而实际上应该是 0 2 0 0 0不满足单调性


#include<cstdio>#include<iostream>#include<cstring>#define maxn 100010using namespace std;typedef long long ll;ll a[maxn];int main(){    int T,n;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%I64d",&a[i]);        int l = 1,r = n;        int k = 0,f1,f2;        for(int i=0;i<n;i++)        {            while(l<r && !a[l])                l++;            if(l>1) //由于把前导0和后导0去掉了,可能会影响下一轮的判断                l = l-1;  //所以前面留一个0            else l = 1;   //本来就没有前导0            while(l<r && !a[r])                r--;            if(r<n-i)                r = r+1;  //后面留一个0            else r = n-i;  //本来就没有后导0            if(l>=r) break;            f1 = f2 = 0;            for(int d=l;d<r;d++)            {                if(a[d+1]>a[d]) //如果单调递增                    f1 = 1;                if(a[d+1]<a[d]) //如果单调递减                    f2 = 1;            }            if(f1 && f2) //既有单调递增的段也有递减的部分,即不满足单调性            {                if(k==0)                    printf("ugly series\n");                else printf("%d\n",k-1);                break;            }            for(int j=l;j<r;j++)                a[j]=a[j+1]-a[j];            r--;  //得到下一个序列,个数减一            k++;        }        if(!f1 || !f2)            printf("nice series\n");    }    return 0;}/*71 1 1 3 5 7 9ans = 1*/


0 0
原创粉丝点击