题面:
翻译:
农夫的奶牛经常越狱.
农夫每天都会记录一个数字,
今天有奶牛越狱,那么记录一个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");
}
}