腾讯2019秋招笔试真题

1、小Q爬塔

描述:小Q正在攀登一座宝塔,这座塔很特别,塔总共有n曾层,但是没两层之间的净高却不相同,所以造成了小Q爬过每层的时间也不同。如果某一层的高度为x,那么爬过这一层锁需的还是件也是x。小Q孩会使用一种魔法,没用一次可以让他向上跳一层或两层,但是每次跳跃之后小Q豆浆用完魔法力,必须爬过至少一层才能再次跳跃(你可以认为小Q需要跳两次一层才休息,最后也可以跳到塔外即超过塔高,跳是不消耗时间的)。
小Q想用最短的时间爬过塔顶,希望你能告诉他最短时间是多少。

输入描述:
第一行一个数n n<=10000,表示塔的层数。
接下来的n行每行一个数h(1<=h<=100),表示从下往上每层的高度。

输出描述:
一个数,表示最短时间。

解题思路

用p[i]表示到达地i层的最短时间,并且到达第i层的方式是爬。
t[i]表示到达第i层的最短时间,并且到达第i层的方式是跳。

到达第i层的方式是采用爬还是采用跳。
情况1:到达第i层所用的方式是爬:
那么到达第I-1层的方式也可以使用跳也可以是爬,从两者中选择最小。
p[i] = min {p[i-1], t[i-1]} + a[i]
情况2:到达第i层的方式是跳:
也许从i-1层跳或者i-2层跳, 同时到达i-1层或i-2层的方式必须是爬,两者时间选择较小者,即:
t[i] = min {p[i-1], p[i-2]}
最后在p[n]和t[n]中选最小者作为结果

参考代码:
#腾讯2019秋招笔试真题
#小Q爬塔
#include<bits/stc++.h>
using namespace std;
int p[10005], t[10005];
int main(){
int n, m, x;
cin >> n;
for(int i=1; i<=n; i++){
cin >> x;
p[i] = min (p[i-1], t[i-1])+x;
if (i==1) continue;
t[i]=min(p[i-1],p[i-2]);
}
cout << min(p[n],t[n]) << endl;
return 0;
}

2 妞妞的问题

题目描述:妞妞公主得到了一块黑白期盼。这块棋盘共有n行m列,任意相邻的两个格子都是不同的颜色(黑与白),坐标(1,1)的格子是白色的。

编辑于 2019-06-18 10:49:17

【题目描述】妞妞公主新得到一块白色棋盘。这块棋盘共有n行m列,任意相邻的两个格子都是不同的颜色(黑或白),坐标位(1,1)的格子是白色的。

这一天牛牛来看妞妞公主时,牛牛公主正望着棋盘发呆。牛牛看妞妞公主闷闷不乐的样子,便对妞妞公主说:“只要你告诉我n和m,我能马上算出黑色方块的白色方块的数量。”

“这太简单了。”妞妞公主想了一会,“我会在这n行m列中选择一个左下角坐标位(x0,y0)。右上角坐标为(x1,y1)的矩形,把这个矩形里的共(x1-x0+1)*(y1-y0+1)个方块全部涂白。你还能马上算出黑色方块和白色方块的数量吗?”

“这太简单了。”牛牛自信一笑,“你还可以在执行涂白操作后再选择一个左下角坐标为(x2,y2),右上角坐标为(x3,y3)的矩形,把这个矩形里的方块全部涂黑。我依然能马上算出黑色方块和白色方块的数量。”

妞妞公主终于惊讶地睁大了眼睛,于是抛出了她的T次提问。

聪明的牛牛当然会做了,但是他想把这个问题交给你,请帮牛牛算出每次提问棋盘的黑白方块数目吧。


输入描述:
第一行一个整数T,表示妞妞公主一共提问了T次。
接下来3T行,
第(1+3
i)行两个整数n,m。表示第i次提问时棋盘的大小;
第(2+3i)行四个整数x0,x1,y0,y1。表示第i次提问时涂白操作选取的两个坐标。
第(3+3
i)行四个整数x2,y2,x3,y3。表示第i次提问时涂黑操作选取的两个坐标。
1<=T<=10000,1<=x<=n<=1000000000,1<=y<=m<=1000000000,x0<=x1,y0<=y1,x2<=x3,y2<=y。


输出描述:
共T行,每行两个整数分别表示白色方块的数量和黑色方块的数量。


输入样例:
3
1 3
1 1 1 3
1 1 1 3
3 3
1 1 2 3
2 1 3 3
3 4
2 1 2 4
1 2 3 3
输出样例:
0 3
3 6
4 8

参考代码
#include <bits/stdc++.h>
using namespace std;
long long x[8], y[8];
int main() {
int T;
long long n, m, black, white, a, b, c, d, e;
scanf(“d%”, &T);
while(T–){
scanf("%lld%lld",&x[i],&y[i]);
black = nm /2;
white = n
m - black;
for(int i=0; i<=3; i++)
scanf("%lld%lld", &x[i,&y[i]]);
if((x[0]+y[0]) & 1)
d = ((x[1]-x[0]+1)(y[1]-y[0]+1)+1)/2;
else d=(x[1]-x[0]+1)
(y[1]-y[0]+1)/2;
white += d;
black -= d;
if((x[2]+y[2]) & 1)
d = (x[3]-x[2]+1)(y[3]-y[2]+1)/2;
else d= ((x[3]-x[2]+1)
(y[3]-y[2]+1)+1)/2;
white -= d;
black += d;
a = max(x[0],x[2]);
b = max(y[0],y[2]);
c = min(x[1],x[3]);
d = min(y[1],y[3]);
if(c<a || d<b) e = 0ll;
else{
if((a+b) & 1)
e = ((c-a+1)(d-b+1)+1)/2;
else e=(c-a+1)
(d-b+1)/2;
}
white -= e;
black += e;
printf("%lld %lld\n", white, black);
}
return 0;
}

3 小Q的最小值序列

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值