题目描述:
小v在公司负责游戏运营,今天收到款申请新上架的游戏“跳一跳”。为了确保提供给广大玩家朋友们的游戏都是高品质的,按照运营流程小v必须对新游戏进行全方位了解体验和评估。这款游戏的规则如下:
有n个盒子排成了一行,每个盒子上面有一个数字a[i],表示在该盒子上的人最多能向右移动a[i]个盒子(比如当前所在盒子上的数字是3,则表示可以一次向右前进1个盒子,2个盒子或者3个盒子)。
现在小v从左边第一个盒子上开始体验游戏,请问最少需要移动几次能到最后一个盒子上?
输入描述:
输入:2 2 3 0 4
表示现在有5个盒子,上面的数字分别是2, 2, 3, 0, 4。
输出描述:
输出: 2
小v有两种跳法:
跳法1:盒子1--盒子2--盒子3--盒子4--盒子5,共3下
跳法2:盒子1--盒子3--盒子5,共2下
跳法2的步骤数量最少,所以输出最少步数:2。
输入:
2 2 3 0 4
输出:
2
核心代码:
int jump(int a[], int n) {
int steps = 0;
int start = 0;
int end = 0;
while(end < n - 1)
{
int max_pos = 0;
for(int i = start; i <= end; ++i)
max_pos = max(max_pos, i + a[i]);
start = end + 1;
end = max_pos;
++steps;
}
return steps;
}
题目描述:
今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N (N<100000) 个人排成一排,从第1个人开始报数: 如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
输入描述:
输入2个正整数,空格分隔,第一个代表人数N,第二个代表M
输出描述:
输出一个int数组,每个数据表示原来在队列中的位置用空格隔开,表示出列顺序
输入:
6 3
输出:
3 6 4 2 5 1
这道题目就是简单的约瑟夫环
核心代码:
void loop(int n,int M)
{
int a[n],m=0,number=0;
int i,j;
for(j=0;j0)
{
m++;
if(m==M)
{
if(d >= 1)
printf(" %d",a[i]);
else
printf("%d", a[i]);
d++;
a[i]=0;
m=0;
number++;
if(number==n)
{
break;
}
}
}
if(i==(n-1))
{
i=-1;
}
}
cout << endl;
}
题目描述:
小v最近在玩一款挖矿的游戏, 该游戏介绍如下:
1、每次可以挖到多个矿石,每个矿石的重量都不一样,挖矿结束后需要通过一款平衡矿车运送下山;
2、平衡矿车有左右2个车厢,中间只有1个车轮沿着导轨滑到山下,且矿车只有在2个车厢重量完全相等且矿石数量相差不超过1个的情况下才能成功运送矿石,否则在转弯时可能出现侧翻。
假设小v挖到了n (n<100) 个矿石,每个矿石重量不超过100,为了确保一次性将n个矿石都运送出去,一旦矿车的车厢重量不一样就需要购买配重砝码。请问小v每次最少需要购买多少重量的砝码呢? (假设车厢足够放下这些矿石和砝码,砝码重量任选)
输入描述:
输入n个正整数表示每个矿石的重量
输出描述:
输出一个正整数表示最少需要购买的砝码重量
输入:
3 7 4 11 8 10
输出:
1
说明:
小v可以将重量3,7和11的矿石放到左车厢,重量4,8和10放到右车厢,然后购买重量为1的砝码放到左车厢。
题解:其实可以转换为求n个数分成两半,使绝对值差就小,我们可以转化为01背包去做。
这个题目当时只过了差不多百分之八十,一直没有搞懂原因,今天摘抄题目的时候才发现题目要求是矿石的数量最多相差为1,哭唧唧,现在贴的是提交的代码,正确的之后再改吧!!!!
代码:
void loop(int n, int weight[])
{
int Sum = 0, sum;
int dp[10009];
for(int i = 0; i < n; i++)
Sum += weight[i];
sum = Sum / 2;
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++)
for(int v = sum; v >= weight[i]; v--)
dp[v] = max(dp[v], dp[v - weight[i]] + weight[i]);
Sum -= dp[sum];
// cout << dp[sum] << endl;
// cout << Sum << endl;
if(Sum > dp[sum])
cout << Sum - dp[sum] << endl;
else
cout << dp[sum] - Sum << endl;
}