C语言问题求解,在线等,急!!!

2024-11-14 14:53:55
推荐回答(3个)
回答1:

思路:

1、根据题意每天从区间1~N中,依次深度-1,遇到某个深度0时停止作业,所修改的区间就是当日作业区间。

2、独立函数实现一天作业(workForDay)。参数flag为1显示作业过程,如不需要传0。

3、init函数为输入并返回动态数组。

#include

#include

int len=0;//路面长度

int *init();//根据输入初始化深度数组,成功返回地址,失败返回NULL

int workForDay(int *dps,int flag);//执行一天填充作业。成功作业返回1,无需作业返回0, 异常返回-1

//flag=1,打印输出作业过程。flag=0,不打印过程

int main()

{

    int day=0,re,*dps=NULL;

    dps=init();

    if(!dps) return 1;

    while((re=workForDay(dps,1))==1)

        day++;

    if(re==-1) return 1;

    printf("共作业%d天\n",day);

    free(dps);dps=NULL;//在本程序可不释放,但如果多次调用init函数,每次用完数组,需这样释放内存。

    return 0;

}

int *init()

{

    int i,*dps=NULL;//dps每单位长度对应深度

    len=0;

    while(len<=0) scanf("%d",&len);//长度必须大于0整数

    dps=(int *)malloc(sizeof(int)*len);

    if(!dps) return NULL;

    for(i=0;(dps[i]=-1) && i

        while(dps[i]<0) scanf("%d",&dps[i]);//每个深度必须大于等于0整数

    return dps;

}

int workForDay(int *dps,int flag)

{

    int i,bn=-1,an=-1;

    if(!dps) return -1;

    for(i=0;i

    {

        if(bn==-1 && dps[i]>0)

            bn=i+1,an=bn,dps[i]--;

        else if(bn!=-1 && dps[i]>0)

            an=i+1,dps[i]--;

        else if(bn!=-1 && dps[i]==0)

            break;

    }

    if(bn==-1) return 0;

    if(flag) printf("当日作业区间为[%d,%d]\n",bn,an);

    return 1;

}

回答2:

//这应该是用贪心,我以前好像写过这个题,好像是洛谷的题
#include
#define N 100010
int a[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
long long sum = a[0];
for (int i = 1; i < n; i++) {
if (a[i] > a[i - 1]) {
sum += a[i] - a[i - 1];
}
}
printf("%lld", sum);
return 0;
}

回答3:

#include
#include

#include

#pragma warning(disable:4996)

unsigned int len = 1;//路面长度
unsigned int day = 0;

void init(unsigned int* dps);//根据输入初始化深度数组,成功返回地址,失败返回NULL

int workForDay(unsigned int* dps, int flag);//执行一天填充作业。成功作业返回1,无需作业返回0, 异常返回-1

//flag=1,打印输出作业过程。flag=0,不打印过程

int main()

{

unsigned int re, * dps = NULL;

scanf("%u", &len);//长度必须大于0整数

dps = (unsigned int*)malloc(sizeof(unsigned int) * len);

init(dps);

while ((re = workForDay(dps, 1)) == 1)

day++;

if (re == -1) return 1;

printf("共作业%u天\n", day);

free(dps);
dps = NULL;//在本程序可不释放,但如果多次调用init函数,每次用完数组,需这样释放内存。

return 0;

}

void init(unsigned int* dps )

{

unsigned int i;

for (i = 0; i < len; i++)

{
scanf("%u", &dps[i]);//每个深度必须大于等于0整数
}

}

int workForDay(unsigned int* dps, int flag)

{

unsigned int i;
int bn = -1, an = -1;

if (!dps) return -1;

for (i = 0; i < len; i++)

{

if (bn == -1 && dps[i] > 0)

{
bn = i + 1;
an = bn;
dps[i]--;
}

else if (bn != -1 && dps[i] > 0)

{
an = i + 1;
dps[i]--;
}

else if (bn != -1 && dps[i] == 0)

break;

}

if (bn == -1) return 0;

if (flag) printf("第%u日作业区间为[%d,%d]\n",day+1, bn, an);

return 1;

}