水题1:
题目描述
猫为什么过马路是一个历史悠久的问题,并且得到了科学界极大的重视。 令人惊讶的是,关于犬过马路的研究文献却很少。 犬国军政大臣HSQ意识到了问题的重要,于是他与犬国大学合作研究这一问题。HSQ的工作就是记录犬穿过马路的次数,他认真的记录了关于犬的位置的数据,并在一天内进行了一系列观察。它记录了每只犬的编号和特在马路的哪一侧(编号是个整数且小于等于10,因为犬国只有10只犬) 根据农民约翰记录的数据,请帮助他计算确定的犬过马路的次数。如果连续看到一只犬出现在道路的两侧,就会确认过了一次马路
输入格式
第一行输入包含观察次数N,一个最多为100的正整数。
接下来N行每一行包含一个观察结果,由两个数构成,第一个数是犬编号,第二个数是0或1,表示位置(道路一侧为0,另一侧为1)。
输出格式
一个数据,输出过马路次数。。
样例数据
input
8
3 1
3 0
6 0
2 1
4 1
3 0
4 0
3 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;
}