三道水水的奶牛题

来源:互联网 发布:歌曲剪辑合成软件 编辑:程序博客网 时间:2024/05/21 00:15

水题1:

题目描述

猫为什么过马路是一个历史悠久的问题,并且得到了科学界极大的重视。 令人惊讶的是,关于犬过马路的研究文献却很少。 犬国军政大臣HSQ意识到了问题的重要,于是他与犬国大学合作研究这一问题。HSQ的工作就是记录犬穿过马路的次数,他认真的记录了关于犬的位置的数据,并在一天内进行了一系列观察。它记录了每只犬的编号和特在马路的哪一侧(编号是个整数且小于等于10,因为犬国只有10只犬) 根据农民约翰记录的数据,请帮助他计算确定的犬过马路的次数。如果连续看到一只犬出现在道路的两侧,就会确认过了一次马路

输入格式

第一行输入包含观察次数N,一个最多为100的正整数。

接下来N行每一行包含一个观察结果,由两个数构成,第一个数是犬编号,第二个数是0或1,表示位置(道路一侧为0,另一侧为1)。

输出格式

一个数据,输出过马路次数。。

样例数据

input

83 13 06 02 14 13 04 03 1

output

3

在这个例子中,犬3过马路两次 特首先出现在第1侧,然后出现在第0边,然后再出现在第1边。犬4过马路一次。犬2和6似乎没有过马路。


大致思路:

      判断每只猫是否是第一次出现,如果第一次出现,则将数组标记为第一次出现;否则不是第一次出现,就判断这次出现的地方和上次到底一不一样,如果不一样,则说明过来人一次马路,则结果+1

     程序为:

#include <bits/stdc++.h>using namespace std;int main(){int a[10000],n,x,y,s=0;cin>>n;for (int i=1;i<=10000;i++) a[i]=-2;//初始化for (int i=1;i<=n;i++) {cin>>x>>y;if (a[x]!=y&&a[x]!=-2) //判断如果走得和原来不同和不是第一次走得情况{s++;a[x]=y;}else if (a[x]==-2) a[x]=y;//标记为第一次走}cout<<s;return 0;}

水题2:

题目描述

男神Sharpland农场的布局相当奇特,他的牛白天吃草的田野周围,绕着一条大型圆形道路。

每天早晨,牛在前往田野时要穿过这条路,每天晚上,他们离开田野回到谷仓时,都会再过一遍这条路。

正如我们所知,牛是一种习惯性动物,它们每天都以同样的方式过马路。每头牛都在不同的点进入田野,走出田野,并且所有的点都与其他的不同。Sharpland拥有26头牛,他把他们命名为A到Z,所以在这条路上有52个点。Sharpland通过绕着圆形道路顺时针方向扫描这些点来记录它们,写下每一个点所属的牛的名字,最终形成一个有52个字符的字符串,字母表中的每一个字母都出现了两次。

他没有记录哪些点是进入田野的点,哪些是走出田野的点。

看着他的地图,Sharpland很好奇,在一天中会有多少对不同的奶牛穿过马路。如果牛A从入口到出口的路径必须穿过牛B从入口到出口的路径,他把这对奶牛(A,B)称为交叉对。请帮助Sharpland计算出交叉对的数量。

输入格式

输入由一行包含52个大写字母的字符串组成。其中每个大写字母都出现了两次。

输出格式

请输出交叉对的总数。

样例数据

input

ABCCABDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ

output

1(在这个样例中,只有牛A和牛B是一对交叉对。)
    题目思路:

  交叉对的意思:设两个字母为A和B,即A的左边和右边有B的左边,但是没有B的右边。如:ABAB是,BABA是,ABBA不是。

那么只要每次将输入的数据中记录每个字母的头和尾(即左边和右边),然后按上述交叉对的意思进行判断即可

程序:

#include <bits/stdc++.h>using namespace std;int main(){int head[1000]={},tail[1000]={},s=0;char a;for (int i=1;i<=52;i++){cin>>a;if (head[a]==0) head[a]=i;else tail[a]=i;}for (int i='A';i<='Z';i++)  for (int j='A';j<='Z';j++)    if (head[i]<head[j]&&head[j]<tail[i]&&tail[i]<tail[j])      s++;cout<<s;return 0;}

水题3:

题目描述

Farmer John在他晚年的时候脾气变得越来越暴躁,因为他经常忘记自己的奶牛长什么样,所以他修了一个大栅栏,不让邻居的奶牛来参观。

Fj的奶牛们表示很难过,不仅仅是因为他们没法和朋友们一起愉快的玩耍,而且他们也没法参加他们期待已久的国际奥林匹克挤奶大赛了。

但还是有一些奶牛可以通过栅栏,到fj的农场,不过他们只能从一个小门一个一个进去,还要回答一系列神奇的问题,于是奶牛们经常要排很长的队伍才能成功进入。

对于每n只拜访这个农场的奶牛,你被告知她到达门口的时间以及她回答问题所需要的时间。

在任何时间只有一头奶牛可以被提问,所以如果同一时间有许多奶牛到达,她们可能要排队等待,逐一解决。

举个栗子,如果一只奶牛在时间为5的时候到达,并且回答问题用的时间为7,另一只奶牛在时间为8的时候到达,就需要等到时间为12时再开始回答问题。

请你确定所有奶牛都能进入农场的最早时间。

输入格式

第一行是正整数N(N<=100),

接下来的N行有两个正整数a,b,(a,b<=1,000,000),

a指的是奶牛到达小门的时间,b表示这个奶牛回答问题需要的时间

输出格式

输出一个数,表示所有奶牛都进入农场时的最早时间

样例数据

input

3    2 1    8 3    5 7

output

15

数据规模与约定

在这里,第一头奶牛在两点到达,并很快被处理。直到第三头牛在5点到达,并开始处理时,大门一直处于短暂的空闲状态。

第二只母牛会在8点钟到达,到5 +7= 12时开始回答问题,12 +3 = 15时时结束

        

题目思路:

1.按照奶牛的到达时间进行排序

2.判断每个奶牛最后结束的时间

3.如果结束的时间比下一只奶牛到达的时间少,则对下一只奶牛答题的时间没有任何影响

else(否则),下一只奶牛开始答题的时间是上一次奶牛结束的时间是last_time(一个变量,即上一只奶牛结束的时间)

程序为:

#include <bits/stdc++.h>using namespace std;int main(){int n,last_time=0,a[200],b[200];cin>>n;for (int i=1;i<=n;i++)   cin>>a[i]>>b[i];for (int i=1;i<=n-1;i++)  for (int j=i+1;j<=n;j++)    if (a[i]>a[j])    {    int t=a[i];    a[i]=a[j];    a[j]=t;    int q=b[i];    b[i]=b[j];    b[j]=q;    }for (int i=1;i<=n;i++)   if (last_time<a[i]) last_time=a[i]+b[i];else last_time+=b[i];cout<<last_time;return 0;}




原创粉丝点击