codeforces 659 D. Bicycle Race

水水的想了半天,没想出方法。。
难道只有无脑码代码了吗。。
最后也只有无脑的码起来了。。
我的方法好笨的。。。
判断内点。
顺时针跑的话,逆时针转弯爆炸
逆时针跑,顺时针转弯爆炸。。

由第一条和最后一条路判断怎么跑。。(这是我昨天的想法,是错的orz)

然后和做过的同志一起发现,数据只有顺时针跑ORZ。。
今天在电路课上,随意画了一个城堡,然后发现有问题。。

其实并不用去想顺时针跑还是逆时针跑。。

1.内点的数量一定比外点少

2.只要是内点,无论逆时针还是顺时针跑,都会入水

3.内点的顺序于外点相反。。所以直接min就可以了(4.22更新)。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
#define maxn 10010
struct sb
{
    int x;
    int y;
}way[maxn];
int dir[maxn];
int main()
{
    int n;
    cin>>n;
    int cnt=0;

    for(int i=1;i<=n+1;i++)
    {
        cin>>way[i].x>>way[i].y;
    }
    for(int i=2;i<=n+1;i++)
    {
        cnt++;
        if(way[i-1].x==way[i].x)
        {
            if(way[i].y>way[i-1].y)
            {
                dir[cnt]=1;
            }
            else
            {
                dir[cnt]=2;
            }
        }
        else
        {
            if(way[i-1].x>way[i].x)
            {
                dir[cnt]=3;
            }
            else
            {
                dir[cnt]=4;
            }
        }
    }
    int ans1=0,ans2=0;
    int type=0;
    //if((dir[1]==1&&dir[cnt]==4)||(dir[1]==2&&dir[cnt]==3)||(dir[1]==3&&dir[cnt]==1)||(dir[1]==4&&dir[cnt]==2))
    //{
    // type=1;
    //}
    //1 shang 2xia 3zuo 4 you;
    for(int i=1;i<cnt;i++)
    {
        if((dir[i]==1&&dir[i+1]==4)||(dir[i]==2&&dir[i+1]==3)||(dir[i]==3&&dir[i+1]==1)||(dir[i]==4&&dir[i+1]==2))
        {
            ans1++;
        }
        else if(dir[i]!=dir[i+1])
            ans2++;
    }
    //if(type)
      // cout<<ans1<<endl;
    //else
     // cout<<ans2<<endl;
     cout<<min(ans1,ans2)<<endl;
    //cout<<ans1<<" "<<ans2<<endl;
    return 0;
}

你可能感兴趣的:(数学,codeforces)