[ 题解 ] [ 逆推 ] 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 }

 

转载于:https://www.cnblogs.com/Kaidora/p/10534686.html

动态分区分配方式是一种通过划分内存块来满足进程的内存需求的方法。这种分配方式的实现需要使用空闲分区表来记录内存的空闲情况,并根据进程的大小找到合适的空闲分区进行分配。 对于a.5中的题目,我们可以使用一个动态分区分配方式的模拟答案来解答。假设有以下内存空间和进程需求: 内存空间: 1. 起始地址:0,大小:100 2. 起始地址:100,大小:50 3. 起始地址:150,大小:75 4. 起始地址:225,大小:200 进程需求: 1. 进程A,大小:130 2. 进程B,大小:70 3. 进程C,大小:90 初始状态下,空闲分区表中只有一个分区,起始地址为0,大小为400。按照从小到大的顺序,我们可以将进程依次分配到空闲分区中。首先,将进程A分配到起始地址为0,大小为130的分区中,更新空闲分区表为: 1. 起始地址:130,大小:370 然后,将进程B分配到起始地址为130,大小为70的分区中,更新空闲分区表为: 1. 起始地址:200,大小:300 最后,将进程C分配到起始地址为200,大小为90的分区中,更新空闲分区表为: 1. 起始地址:290,大小:210 经过分配后,空闲分区表中只有一个分区,它的起始地址为290,大小为210。 这样,我们利用动态分区分配方式将进程分配到内存空间,并更新了空闲分区表的内容。通过这个模拟答案,我们可以更好地理解动态分区分配方式的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值