1. 程式人生 > >Google APAC 2016 University Graduates Test Practice Round APAC test

Google APAC 2016 University Graduates Test Practice Round APAC test

谷歌校招筆試的練習賽,題目很簡單,應該只是用來熟悉環境的

題目連結

A - Bad Horse
題意
有一些人,並且告訴一些二元關係,表示哪對人是不能屬於一個組的,問可不可以將所有人分為兩組。
題解
也就是給了一個圖判斷其可不可以表示為二分圖了,根據二分圖的性質知道存在奇圈的圖就無法表示成,所以根據題意的二元關係作圖後,找圖中是否存在奇圈即可。

Code:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue> #include <stack> #include <map> #define MAXN 305 //--- using namespace std; struct edge{ int u,v,next; }edge[MAXN]; map<string,int> H; int En,_next[MAXN],dis[MAXN]; void addedge(int u,int v){ edge[++En].next=_next[u],_next[u]=En; edge[En].u=u,edge[En].v=v; } bool
dfs(int u,int l){ if (dis[u]!=-1){ if (dis[u]%2 == l%2) return true; return false; } dis[u]=l; for (int k=_next[u];k;k=edge[k].next){ int v=edge[k].v; if (!dfs(v,l+1)) return false; } return true; } bool judge(int n){ memset(dis,-1,sizeof
(dis)); for (int i=1;i<=n;i++) if (dis[i]==-1){ if (!dfs(i,0)) return false; } return true; } int main(){ freopen("A-small-2-attempt0.in.txt","r",stdin); freopen("output.txt","w",stdout); int T; cin>>T; for (int cases=1;cases<=T;cases++){ int m,n=0; memset(_next,0,sizeof(_next)),En=0; cin>>m; H.clear(); for (int i=1;i<=m;i++){ string s1,s2; int u,v; cin>>s1>>s2; if (H.find(s1)==H.end()) H[s1]=++n; if (H.find(s2)==H.end()) H[s2]=++n; u=H[s1],v=H[s2]; addedge(u,v),addedge(v,u); } printf("Case #%d: ",cases); if (judge(n)) puts("Yes"); else puts("No"); } return 0; }

B - Captain Hammer
題意
類似打企鵝,憤怒的小鳥之類的遊戲,從(0,0)點以初始速度V丟擲物體,已知重力加速度為9.8m/s^2,已知物體落地後停止移動,並且在X軸上前進了D米,問初始丟擲時角度是多少。
題解
中學物理題,噁心的是直接用cmath的asin居然會WA…於是手寫了個二分來求arcsin。

Code:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>  
using namespace std;
const double PI=acos(-1.0); 
const double eps=1e-10;
double aSin(double x){
    double l=0,r=PI/2;
    while (r-l>eps){
        double mid=(l+r)/2;
        if (sin(mid)<=x) l=mid;
                    else r=mid; 
    }
    return l;
}
int main(){
    freopen("B-small-attempt1.in.txt","r",stdin);
    freopen("output.txt","w",stdout); 
    int T;
    scanf("%d",&T);
    for (int cases=1;cases<=T;cases++){
        int V,D;
        scanf("%d%d",&V,&D);
        double ans=9.8*D/(V*V); 
        ans=aSin(ans);  
        printf("Case #%d: %.8f\n",cases,ans*90/PI);
    }
    return 0;
}

C - Moist
題意
有一堆寫了人名的卡片放在一個棧中,希望讓這個棧中所有卡片按照人名的ASCII碼從棧頂到棧底排好序。而現在有一個機器人,它做的操作是每次從棧頂往棧底掃描,一旦發現有一個人名的ASCII碼比之前掃過的要小,就話費1刀的代價將其放在棧頂到它這一段目前正確的位置,然後機器人再從棧頂往棧底掃描,直到這個棧排好序,問總共要話費多少刀。
題解
模擬

Code

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack> 
#include <map>
using namespace std;
const int MAXN=105;
string s[MAXN];
char str[105];
int main(){
    freopen("C-small-2-attempt0.in.txt","r",stdin);
    freopen("output.txt","w",stdout); 
    int T;
    scanf("%d",&T);
    for (int cases=1;cases<=T;cases++){
        int n;
        scanf("%d\n",&n); 
        for (int i=1;i<=n;i++) gets(str),s[i]=str;
        int ans=0;
        for (int t=2;t<=n;t++){
            int i;
            for (i=t;i<=n;i++)
                if (s[i]<s[i-1]){
                    ans++;
                    break;
                }
            for (;i>=2;i--)
                if (s[i]<s[i-1]) swap(s[i],s[i-1]);
        }
        printf("Case #%d: %d\n",cases,ans);
    }
    return 0;
}