Taming the Herd 题解

题面:

在这里插入图片描述

翻译:

农夫的奶牛经常越狱.
农夫每天都会记录一个数字,
今天有奶牛越狱,那么记录一个0
今天没有奶牛越狱,那么就记录一个数字,表示多少天前有奶牛越狱.比如昨天有奶牛越狱,那么记录为1.
已知第一天一定有奶牛越狱.
然而农夫之后把日志弄丢了,只记得一部分.
请你根据剩下的数据计算出记录的那几天中最多和最少可能有多少头牛越狱.

输入:

第一行是一个数字n,代表农夫记录了多少天
第二行是n个数字,代表农夫记录的日志,弄丢了的天数记录为-1

输出:

两个数字,分别为最少和最多可能有多少牛越狱.
如果已知的记录相互矛盾,那么输出-1.

题目分析:

我们从最后一天开始往前面推.
假如第i天记录的数字Ai大于0并且他的前一位为-1,那么把他的前一位赋值为Ai-1.如果他的前一位不为Ai-1并且不为-1,那么说明数据自相矛盾,直接输出-1.

通过以上方式补全之后,可能还是有几天是-1.
我们假设-1的那几天都有牛越狱,那么就能知道最大可能数量
我们假设-1的那几天都没有牛越狱,那么就能知道最小可能数量
这时数组中0的数量,就是越狱的牛的最少可能数量
数组中0和-1的数量,就是越狱的牛的最多可能数量

代码:

#include<stdio.h>

int n;
int log[110];

int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i){
        scanf("%d", log+i);
    }
    int after = log[n] + 1;
    for(int i = n; i > 0; --i){
        if(log[i] != -1 && log[i] != after - 1 && after != 0){
            printf("-1\n");
            return 0;
        }
        if(after > 0){
            log[i] = --after;
        }
        if(log[i] != -1){
            after = log[i];
        }
    }
    int max, min;
    if(log[1] == 0 || log[1] == -1){
        min = max = 1;
        for(int i = 2; i <= n; ++i){
            if(log[i] == 0){
                min++;
                max++;
            }
            if(log[i] == -1){
                max++;
            }
        }
        printf("%d %d\n", min, max);
    }else{
        printf("-1\n");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值