牧场上的草泥马(游荡的奶牛)

来源:互联网 发布:什么是软件危机 编辑:程序博客网 时间:2024/05/08 10:27

  例题:牧场上的草泥马

  大意:

安第斯山脉印第安人农场的布局相当奇特,他的草泥马白天吃草的田野周围,绕着一条大型圆形道路。

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

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

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

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

这个题目呢,老师已经讲过了,但老师讲完后,我是这样的:


但经过我看人家的程序反复思考(又是这样),终于......

思路是这样的:

 记下草泥马进去的位置和走出的位置,如果A先进A+1后进,而A+1先出A后出,那么他们俩路线交叉,每次累加就行了

代码:

#include<bits/stdc++.h>

using namespace std;
struct cow
{
int t,w;
}a[60];      
//弄个结构体玩玩,t代表进去(头),w代表出来(尾)
 int ans=0; //用来统计交叉数
int main()
{
string s;  //字符串
cin>>s;       
for(int i=0;i<26;i++)a[i].t=a[i].w=0;//都先赋值为0
for(int i=0;i<52;i++)  //进进出出看到52次草泥马
     {
     if(a[s[i]-'A'].t==0)a[s[i]-'A'].t=i+1;//a[1]存A接下来顺序存,t为零时代表它刚进去
     else a[s[i]-'A'].w=i+1;//不为0代表它已经出去,因为i是从0开始所以要加1
     }
     for(int i=0;i<=25;i++)
      for(int j=0;j<=25;j++)
       {
       if(a[i].t<a[j].t&&a[i].w<a[j].w&&a[i].w>a[j].t)ans++;//如果一只比另一只先进并比它先出,但在另一只进去之前就出来,那么就为交叉对
       }
    cout<<ans<<endl;
    return 0;
}
原创粉丝点击