Google APAC 2016 University Graduates Test Round D

本文解析了两道算法竞赛题目:一题涉及处理动态变化的二维数组中的连通块,采用暴力搜索策略解决;另一题则通过二分查找策略求解气球问题中的最优时间分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的Round A晋级了...但是HR说今年7月因为Codejam的原因面过一次了不给再面了..所以Round C和Round B都没怎么做..这次最后一场Round D还是水了一发...虽然太弱了..水了两题...但还是拿了个通过笔试的邮件...估计还是不会给面...


A - Dynamic Grid

        题意:

                给了一个n*m的01矩阵...最大100*100...现在有1000次操作...每次操作分为两个..一个是询问矩阵中有多少个1的连通块..第二个是改变某个位置的值...

        题解:

                100*100*1000可以接受...所以暴力求解.

Code:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <map>
#include <stack>
#include <string.h>
using namespace std;    
int a[105][105],n,m,f[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char s[10],str[105][105];
bool used[105][105];
void dfs(int x,int y){
	if (x==0 || y==0 || x>n || y>m) return;
	if (!a[x][y]) return;
	if (used[x][y]) return;
	used[x][y]=true;
	for (int k=0;k<4;k++) dfs(x+f[k][0],y+f[k][1]);
}
int main(){  
	int T,cases;
	freopen("A-large.in.txt","r",stdin);
	freopen("output.txt","w",stdout);   
	scanf("%d",&T);
	for (int cases=1;cases<=T;cases++){
		printf("Case #%d:\n",cases);
		scanf("%d%d",&n,&m);
		for (int x=1;x<=n;x++) 
				scanf("%s",str[x]+1);
		for (int x=1;x<=n;x++)
			for (int y=1;y<=m;y++)
				a[x][y]=str[x][y]-'0';
		int num;
		scanf("%d",&num);  
		while (num--){ 
			scanf("%s",s);
			if (s[0]=='Q'){
				int ans=0;
				memset(used,false,sizeof(used));
				for (int x=1;x<=n;x++)
					for (int y=1;y<=m;y++)
						if (a[x][y] && !used[x][y]){
							ans++;
							dfs(x,y);
						}
				printf("%d\n",ans);
			}else{
				int x,y,z;
				scanf("%d%d%d",&x,&y,&z); 
				x++,y++;
				a[x][y]=z; 
			}
		}
	}
	return 0;
}  

B - gBalloon

        题意:

             有N个气球(N<=100)..有一个大楼最多M层(M<=1000)...现在每个气球都在各自的楼层..且在各自的位置..比如可以用(x,y)描述一个气球...而不同的楼层有不同的风力..可以使得再该楼层的气球每秒种向正x方向或者负x方向移动多少距离..对于一个气球..可以用|Hi-Hj|的能量移动其楼层..其中Hi是该气球本来的位置..Hj是移动到的位置..且上下移动是瞬间完成的...当一个气球移动到x=0的位置时就可以停下了..现在给出了可以使用的总能量..问最少需要多少的时间让所有的气球都到达x=0的位置..

       题解:

            如果直接从能量的角度出发..问题会变得很复杂..因为对于一个气球为了能快速到达x=0而使用了能量..可能会使得另一个气球所需要的能量不够用..换一个角度..可以发现时间对于每个气球来说是很独立的...且当总时间越多...所需要的能量必然是非递增的...有一个单调的关系...那么二分时间后计算每个气球在这个时间上到达x=0所需要的最少能量之和是否小于可以使用的能量...

Code:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <map>
#include <stack>
#include <string.h>
using namespace std;    
const int oo=10005;
int V[1005],H[105],P[105]; 
bool judge(int n,int m,int q,int t){
	int sum=0,k;
    for (int i=1;i<=n;i++){
    	int x,x0,temp=oo;
    	if (P[i]==0) continue;
    	for (int h=0;h<m;h++){
    		if (!V[h]) continue;
    		if (P[i]>0 && V[h]>0) continue;
    		if (P[i]<0 && V[h]<0) continue; 
    		x0=abs(P[i]),x=abs(V[h]);
    		if ((x0+x-1)/x>t) continue;  
            temp=min(temp,abs(h-H[i]));
    	} 
    	sum+=temp;
    }
	return sum<=q;
}
int main(){  
	int T,cases;
	freopen("B-large.in.txt","r",stdin);
	freopen("output.txt","w",stdout);   
	scanf("%d",&T);
	for (int cases=1;cases<=T;cases++){
		printf("Case #%d: ",cases); 
		int n,m,q;
		scanf("%d%d%d",&n,&m,&q);
		for (int i=0;i<m;i++) scanf("%d",&V[i]); 
		for (int i=1;i<=n;i++) scanf("%d%d",&P[i],&H[i]); 
		int L=-1,R=oo;
		while (R-L>1){
			int mid=(L+R)>>1;
			if (judge(n,m,q,mid)) R=mid;
			                 else L=mid;
		} 
		if (R==oo) puts("IMPOSSIBLE"); 
		      else printf("%d\n",R);
	}
	return 0;
}  



资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值