Google APAC 2016 University Graduates Test Practice Round APAC test
阿新 • • 發佈:2019-02-07
谷歌校招筆試的練習賽,題目很簡單,應該只是用來熟悉環境的
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;
}