[ 题解 ] [ 逆推 ] A. Taming the Herd

http://codeforces.com/group/NVaJtLaLjS/contest/238204/problem/A


题意:

农夫的牛冲破了牛棚,当天农夫在牛棚弄了个计数器,这个计数器记录了牛棚最后一次被撞是几天前。

如果某天牛冲破了牛棚,那么当天计数器为0,第二天为1

可是农夫发现他的数据损坏了,丢失的数据以-1表示。农夫确信计数器第一天是0

现在问:按照这些数据,牛最少冲撞牛棚几次?最多几次?

如果发现数据错误(比如32)输出-1


示例:

Input

4
-1 -1 -1 1

Output

2 3

如果我们知道某天的数据是5,那么可以肯定推出昨日的数据是4

如果昨日的数据是-1,覆盖;如果不是4,那么可以输出-1结束了。

4的话,继续往前推,一直到0为止。这样可以刷出全部已知数据。


其中,第一天必定是0,这个是要稍微照顾下的。


刷完可能还有未知数据-1。假设牛在这些天都没有冲撞牛棚,那么0的数量就是最小答案;

假如牛天天冲撞牛棚,那么加上-1的数量就是最大答案了。

 1 #include <stdio.h>
 2 
 3 int Log[102]={0};
 4 
 5 int main()
 6 {
 7     int N;
 8     short fail=0;
 9     scanf("%d",&N);
10     for(int n=1;n<=N;n++)
11     {
12         scanf("%d",&Log[n]);
13         if(n==1)
14         {
15             if(Log[1]==0)continue;
16             if(Log[1]==-1)Log[1]=0;continue;
17             
18             fail=1;
19         }
20         if(Log[n]>0)
21             for(int i=n-1;i>0;i--)
22             {
23                 if(Log[i]==-1)
24                     Log[i]=Log[i+1]-1;
25                 
26                 if(Log[i]!=Log[i+1]-1)fail=1;
27                 if(Log[i]==0)break;
28             }
29     }
30     if(fail){    puts("-1");    return 0;}
31     
32     int Zero=0,Nega=0;
33     for(int n=1;n<=N;n++)
34     {
35         if(Log[n]==0)Zero++;
36         if(Log[n]==-1)Nega++;
37     }
38     printf("%d %d\n",Zero,Zero+Nega);
39     return 0;
40 }

猜你喜欢

转载自www.cnblogs.com/Kaidora/p/10534686.html
今日推荐