ZOJ - 4107Singing Everywhere——暴力+模拟

Singing Everywhere
一开始的代码,时间复杂度仍然是线性的,但是仅仅因为常数过大,还是超时了。。。

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define ull unsigned long long
#define INF0x3f3f3f3f
const int dx[] ={-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;

int a[100005],n;
bool v[100005];
int main(){
    int t;
    cin>>t;
    while (t--)
    {
        ms0(v);
        ms0(a);
        scanf("%d",&n);
        if(n<=2)
        {
            printf("%d\n",0);
            continue;
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        int ans = 0;
        for(int i=2;i<=n-1;i++)
        {
            if(a[i-1]<a[i] && a[i]>a[i+1])
            {
                ans++;
                v[i]=1;
            }
        }
        int temp,res=0;
        for(int i=2;i<=n-1;i++)
        {
            temp=0;
            if(v[i])
            {
                temp++;
                if(i+2<=n && a[i+1]>a[i-1] && a[i+1]>a[i+2])
                {
                    temp--;
                }
                if(i-2>=1 && a[i-1]>a[i+1] && a[i-1]>a[i-2])
                {
                    temp--;
                }
            }
            else
            {
                if(v[i-1])
                {
                    if(a[i-1]<=a[i+1])
                    {
                        temp++;
                    }
                }
                else
                {
                    if(i-2>=1 && a[i-1]>a[i+1] && a[i-1]>a[i-2])
                    {
                        temp--;
                    }
                }
                if(v[i+1])
                {
                    if(a[i+1]<=a[i-1])
                    {
                        temp++;
                    }
                }
                else
                {
                    if(i+2<=n && a[i+1]>a[i-1] && a[i+1]>a[i+2])
                    {
                        temp--;
                    }
                }
            }
            res = max(res,temp);
        }
        temp=0;
        if(v[2]){
            temp++;
        }
        res = max(res,temp);
        temp=0;
        if(v[n-1]){
            temp++;
        }
        res = max(res,temp);
        printf("%d\n",ans-res);
    }
    return 0;
}

AC代码:

#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define ull unsigned long long
#define INF0x3f3f3f3f

using namespace std;

const int maxn = 1e5+6;
ll a[maxn];
int n;
int main(){
    int t;
    cin>>t;
    while (t--)
    {
        ms0(a);
        scanf("%d",&n);
        a[0]=a[n+1]= 1e12;
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
        }
        int sum = 0;
        for(int i=2;i<=n-1;i++)
        {
            if(a[i-1]<a[i] && a[i]>a[i+1])
                sum++;

        }
        int res=0;
        for(int i=2;i<=n-1;i++)
        {
            int ans = 0,ans1 = 0;
            if(a[i]>a[i-1] && a[i]>a[i+1])
                ans1++;
            if(a[i+1]>a[i+2] && a[i+1]>a[i])
                ans1++;
            if(a[i-1]>a[i-2] && a[i-1]>a[i])
                ans1++;
            if(a[i-1]>a[i+1] && a[i-1]>a[i-2])
                ans++;
            if(a[i+1]>a[i-1] && a[i+1]>a[i+2])
                ans++;
            res=max(res,ans1-ans);
        }
        printf("%d\n",sum-res);
    }
    return 0;
}


发布了78 篇原创文章 · 获赞 0 · 访问量 3410

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/104897841
ZOJ