标签:line bsp 最小 计数 short 天都 link lin tput
http://codeforces.com/group/NVaJtLaLjS/contest/238204/problem/A
题意:
农夫的牛冲破了牛棚,当天农夫在牛棚弄了个计数器,这个计数器记录了牛棚最后一次被撞是几天前。
如果某天牛冲破了牛棚,那么当天计数器为0,第二天为1。
可是农夫发现他的数据损坏了,丢失的数据以-1表示。农夫确信计数器第一天是0。
现在问:按照这些数据,牛最少冲撞牛棚几次?最多几次?
如果发现数据错误(比如3,2)输出-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 }
[ 题解 ] [ 逆推 ] A. Taming the Herd
标签:line bsp 最小 计数 short 天都 link lin tput
原文地址:https://www.cnblogs.com/Kaidora/p/10534686.html