您的位置:首页 > 其它

水水微软苏州校招笔试 1月17日 题解..

2015-01-19 08:43 363 查看
A.Koch Snowflake
找规律...观察K2,K3可以得出在每个Ki中mod 4为2,3的将是当前最新出来的颜色,所以只需要不断的往前迭代直到当前标号迭代后所对应标号是某个Ki中mod
4为2,3的...
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define MAXN 100005
using namespace std;
int main()
{
        int cases,i,n; 
        scanf("%d",&cases);
        while (cases--)
        {
                scanf("%d%d",&i,&n);
                while (i%4!=2 && i%4!=3 && n) 
                {
                         if (i%4==0) i/=4;
                               else  i=i/4+1;
                         n--;
                }
                printf("%d\n",n);                
        }
        return 0;
}


B.Shortest Proper Prefix
简单的字典树...为了方便记录一下每个点的father...

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define MAXN 2000005
using namespace std;
struct node
{
        int son[26],f,m;
}T[MAXN];
char s[MAXN];
int main()
{
        int n,i,len,num,ans; 
        memset(T,0,sizeof(T)),num=0;
        scanf("%d",&n),T[0].m=10;
        while (n--)
        {
               scanf("%s",s),len=strlen(s);
               int h=0,i,x;
               for (i=0;i<len;i++)
               {
                       x=s[i]-'a';
                       if (!T[h].son[x]) T[h].son[x]=++num,T[num].f=h;
                       h=T[h].son[x];
                       T[h].m++;
               }
        }
        ans=0;
        for (i=1;i<=num;i++)
           if (T[i].m<=5 && T[T[i].f].m>5) ans++;
        printf("%d\n",ans);
        return 0;
}


C.Troublesome Power Supply

 对于些对控制器定义了一些不能同时关,一些不能同时开..否则系统不稳定...由于控制器只有两种状态..所以是很明显的2-SAT

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<algorithm>
#define ll long long
#define oo 1000000007
#define pi acos(-1.0)
#define MAXN 20005
#define MAXM 800005
using namespace std;
struct node
{
       int x,y,next;
}edge[MAXM];
int _next[MAXN],En,dfn[MAXN],low[MAXN],tp[MAXN],tpnum,DfsIndex;
bool instack[MAXN];
stack<int> mystack;
void addedge(int x,int y)
{
       edge[++En].next=_next[x],_next[x]=En;
       edge[En].x=x,edge[En].y=y;
}
void InputData(int n,int m)
{
       int x,y,s,x0,x1,y0,y1;
       memset(_next,0,sizeof(_next)),En=0; 
       while (m--)
       {
              scanf("%d%d%d",&x,&y,&s);
              x0=x<<1,x1=x0|1,y0=y<<1,y1=y0|1;
              if (!s)
              {
                    addedge(x0,y1),addedge(y0,x1);
              }else 
              {
                    addedge(x1,y0),addedge(y1,x0);
              }
       }
       return;
}
void tarjan(int x)
{
       int y,k;
       dfn[x]=low[x]=++DfsIndex;
       instack[x]=true;
       mystack.push(x);
       for (k=_next[x];k;k=edge[k].next)
       {
               y=edge[k].y;
               if (!dfn[y])
               {
                      tarjan(y);
                      low[x]=min(low[x],low[y]);
               }else
               if (instack[y])
                      low[x]=min(low[x],dfn[y]);
       }
       if (low[x]==dfn[x])
       {
               tpnum++;
               do
               {
                     x=mystack.top();
                     mystack.pop();
                     tp[x]=tpnum;
                     instack[x]=false;
               }while (low[x]!=dfn[x]);
       }
       return;
}
bool judge(int n)
{
       int i;
       for (i=0;i<n;i++)
          if (tp[i<<1]==tp[i<<1|1]) return false;
       return true;
}
int main()
{
       int cases,n,m;  
       scanf("%d",&cases);
       while (cases--)
       {
                scanf("%d%d",&n,&m);
                InputData(n,m);
                memset(dfn,0,sizeof(dfn));
                memset(instack,false,sizeof(instack));
                while (!mystack.empty()) mystack.pop();
                DfsIndex=tpnum=0;
                for (int i=0;i<(n<<1);i++)
                   if (!dfn[i]) tarjan(i);
                if (judge(n)) puts("Yes");
                        else  puts("No");
       }
       return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: