80分求助,呜呜呜
查看原帖
80分求助,呜呜呜
1105899
Moon_shen楼主2023/11/25 14:02
//https://www.luogu.com.cn/problem/P6364
//P6364 [传智杯 #2 初赛] 1024 程序员节发橙子

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Stu
{
    long long* a;
    long long* o;
    int size;
    int capacity;
}S;

void StuInit(S* s1)
{
    s1->a = s1->o = NULL;
    s1->size = s1->capacity = 0;
}

void StuPush(S* s1)
{
    if (s1->size == s1->capacity)
    {
        int newcapacity = s1->capacity == 0 ? 4 : s1->capacity * 4;
        long long* tmp = (long long*)realloc(s1->a, sizeof(long long) * newcapacity);
        if (tmp == NULL)
            return;
        s1->a = tmp;
        s1->capacity = newcapacity;
    }
    long long x;
    scanf("%lld", &x);
    s1->a[s1->size] = x;
    ++s1->size;
}

int Test(S* s1)
{
    long long i;
    //每个人的橘子数
    long long* tmp = (long long*)malloc(sizeof(long long) * s1->capacity);
    if (tmp == NULL)
        return 0;
    s1->o = tmp;
    //memset(s1->o, 0, sizeof(s1->o));
    //prev: 前一个值, tail:当前值
    int prev = -1;
    int tail = 0;
    for (i = 0; i < s1->size; ++i)
    {
        if (prev == -1)
        {
            s1->o[tail] = 1;
        }
        else
        {
            if (s1->a[tail] < s1->a[prev])
            {
                s1->o[tail] = 1;
                //向前查找,出现连续的小于或等于,则橘子全部++;
                int j = i - 1;
                for (; j >= 0; j--)
                {
                    if (s1->a[j] >= s1->a[j + 1] && s1->o[j] <= s1->o[j + 1])
                        ++s1->o[j];
                    else
                        break;
                }
            }
            else if (s1->a[tail] > s1->a[prev])
            {
                s1->o[tail] = s1->o[prev] + 1;
            }
            else if (s1->a[tail] == s1->a[prev])
            {
                s1->o[tail] = s1->o[prev];
            }
        }
        prev = tail;
        ++tail;
    }
    long long sum = 0;
    for (i = 0; i < s1->size; ++i)
        sum += s1->o[i];
    return sum;
}
/*
5
3 4 5 4 3
*/
int main()
{
    S stu;
    StuInit(&stu);
    int n;
    scanf("%d", &n);
    long long i;
    for (i = 0; i < n; ++i)
        StuPush(&stu);
    //printf("%zd\n", sizeof(stu.o));
    //Test(&stu);
    printf("%lld", Test(&stu));
    return 0;
}
2023/11/25 14:02
加载中...