hdu 4928 Series 2 (优化+模拟)

题意:

一个含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 100010

using 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;
}

/*
7
1 1 1 3 5 7 9
ans = 1
*/

hdu 4928 Series 2 (优化+模拟)

时间: 2024-10-16 08:23:00

hdu 4928 Series 2 (优化+模拟)的相关文章

HDU 4928 Series 2

有了题解以后这题就成了一个模拟题.不过写了好久才把它写对…… Sad #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> #include <string> #include <queue> #include <stack>

HDU 4928 Series

题意: 0序列为 a1.a2.a3--an 根据运算规则ai=ai+1-ai计算i序列  如果序列单调则为合理序列  问从0开始到第几序列是合理的  如果一直合理就是nice  如果一开始就不合理就是ugly 思路: 照着题解做 - -b  负责度证明很是精妙  具体见官方题解 这里有一点需要补充  就是压缩0的那个优化  压缩只能在串首和串尾进行  因为要保证答案不变 还有不是每次压缩之后留下一个0  而是要保证"对于i序列来讲  如果它被压缩了  那么在压缩处要留下一个0"  注意

hdu 4927 Series 1

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4927 题目大意:就是把相邻的两个数想减,然后会得到一串数,然后继续想减,当还剩一个数时,问这个数是多少. 思路:开始解题时,直接模拟,结果果断WA,然后就在那儿找规律,找出来后发现是各个数的绝对值是杨辉三角(因为这个杨辉三角是正负交替出现的),有啦规律,然后就开始做题,结果还是错啦几次,然后发现是大数问题.然后又改代码,因为数组开的太大,java没过,因为当时用打表求得杨辉三角,所以一直WA,后来才

HDU 4927 Series 1(推理+大数)

HDU 4927 Series 1 题目链接 题意:给定一个序列,要求不断求差值序列,直到剩一个,输出这个数字 思路:由于有高精度一步,所以要推理一下公式,其实纸上模拟一下很容易推出公式就是一个类似杨辉三角的组合数求和,不过奇数位置是加,偶数位置是减,然后高精度过掉 代码: 本人的第一个JAVA程序^ ^ import java.util.Scanner; import java.math.BigInteger; public class Main { public static void ma

HDU 4927 Series (找规律+JAVA)

题目链接:HDU 4927 Series 题意:给出一串N个元素的序列,作为第一串序列,第二串序列是第二串序列相邻元素的查值(即Bi=Ai+1-Ai)...第三串....一直到第N-1串是序列中只有一个数. 刚开始想到模拟一发,WA了一把,推出公式,发现是二项展开的系数(正负交替).组合数,果断要大数,苦逼JAVA不会.和一起队友摸索着,又T了一发,再想到组合数的递推.终于A了 C(a-1,b)=C(a,b)*a/(b-a+1) AC代码: import java.math.BigInteger

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr

hdu 4891 The Great Pan(模拟)

题目链接:hdu 4891 The Great Pan 题目大意:给出一个文本,问说有多少种理解方式. 1. $$中间的,(s1+1) * (s2+1) * ...*(sn+1), si表示连续的空格数. 2.{}中间,即 | 的个数+1. 解题思路:模拟. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1<<22

HDU 4930 Fighting the Landlords 模拟

_(:зゝ∠)_ 4带2居然不是炸弹,, #include <algorithm> #include <cctype> #include <cassert> #include <cstdio> #include <cstring> #include <climits> #include <vector> #include<iostream> using namespace std; #define N 18 #

HDU 4927 Series 1 java大数

java mle前会wa 或者 t 这种事我会乱说? import java.math.*; import java.util.*; import java.io.*; public class Main { BigInteger[] a = new BigInteger[3007]; public void work() { int T; T = cin.nextInt(); while (T-- > 0) { int n; n = cin.nextInt(); for (int i = 0;