Codeforces Round #408 (Div. 2)-B. Find The Bone

来源:互联网 发布:电脑必备软件2016 编辑:程序博客网 时间:2024/06/07 09:07

输入n,m,k
给定你一排水杯,给你m,第一个位置有一个骨头。,说明有m个位置有洞,有洞的在反转的时候无法被移动,而没有洞的在反转杯子的时候会在杯子里。(速度很快),问你最后骨头的位置。
我开始题都没读懂,以为是遍历数据,发现一个有洞了就掉进去了并且标记一下。。样例第一组都是1,所以没有怎么看题。。真吭。
首先要明确如果一有洞那么 结果肯定是1,
后来睡醒了改啊改改了一种写法,又看了别人的博客,这两种我感觉我的比较省内存。。。

#include <bits/stdc++.h>using namespace std;int main(){    int n,m,l;     map<int,int>Map;     int a,b;     scanf("%d%d%d",&n,&m,&l);     for(int i=1;i<=m;i++)     {    scanf("%d",&a);         Map[a]=1;     }     int ans=0;     int flag=0;     bool gx=false;     int wz=1;     for(int i=1;i<=l;i++)     {   scanf("%d%d",&a,&b);        if(a==wz)//如果位置在a,说明a肯定不是坑,这一段都简化了,以前写的都要判断a和b,后来发现没意义。         {         if(Map[b]&&!flag)         {  ans=b;         flag=1;         gx=true;         }         wz=b;         }         else if(b==wz)         {if(Map[a]&&!flag)         {ans=a;flag=1;         gx=true;         }         wz=a;         }     }     if(Map[1])        {cout<<"1"<<endl;        }     else if(flag)     printf("%d\n",ans);     else        printf("%d\n",wz);        //把结果分为中途掉和 完成时看错题的结果。。改了改能过。。        ans就是掉的洞的地方,而wz是最后一路没有掉的结束    return 0;}
#include <iostream>//参考别人的博客的写法。#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <queue>#include <cmath>#include <map>using namespace std;const int maxn = 1e6+100;const int inf = 0x7ffffff;const int mod = 1e9;int vis[maxn];int main(void){    int n,m,k;    int u,v,a; scanf("%d%d%d",&n,&m,&k);   memset(vis,0,sizeof(vis));   for(int i=1;i<=m;i++)   {   scanf("%d",&a);       vis[a]=-1;   }   if(vis[1]!=-1) vis[1]=1;//通过一个1模拟状态。   int ans=1;   for(int i=1;i<=k;i++)   {  scanf("%d%d",&u,&v);     if(ans==u&&vis[u]!=-1)     {   if(vis[v]!=-1)         swap(vis[u],vis[v]);         ans=v;     }      else if(ans==v&&vis[v]!=-1)      {   if(vis[u]!=-1)          swap(vis[u],vis[v]);           ans=u;      }   }    printf("%d\n",ans);    return 0;}
1 0
原创粉丝点击