牛客简单题 河南(差分,位运算)

文章描述了两道编程竞赛题目,第一题涉及计算心形湖中被心岩照亮的格子数,利用差分数组解决;第二题是关于奶牛刑期的位运算问题,通过交换二进制位来最小化刑期。

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

2023河南萌新联赛第(二)场:河南工业大学

释怀的RT

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    又一次收集完树枝后,RT做了防火工作,这次RT成功的使用了树枝战胜了人马。经过了长时间的痛苦折磨,RT释怀了并决定去海拉卢达陆上狩猎岩石巨人,用岩石巨人的心岩照亮心形湖来祭奠他还未开始就结束的爱情。

    假设心形湖由1×\times×n个方格构成,RT在每个方格上放了一个心岩,每个心岩有一个照亮范围x,代表着这块心岩可以照亮它左边x个方格和右边x个方格,但不能照亮心岩所在的方格(假如一个心岩在第5个方格,x=2,那么他只能照亮第3,4和第6,7个方格),现在请你求出心形湖有多少个方格被照亮。

输入描述:

 

第一行一个正整数n,心形湖格子的个数。( 1 ≤\leq≤ n ≤\leq≤ 1e6)

第二行n个整数,第i个数表示第i个心岩能照亮的范围。(0  ≤\leq≤xix_{i}xi​ ≤\leq≤ 1e9)

输出描述:

 一行,一个整数,表示照亮的格子数

示例1

输入

复制5 0 1 0 0 10

5
0 1 0 0 10

输出

复制4

4

说明

前四个方格被最后一个心岩照亮

示例2

输入

5
0 1 0 0 1

输出

3

说明

 

第一个方格和第三个方格被第二个格子的心岩照亮,第四个方格被第五个格子的心岩照亮,一共有三个格子被照亮

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i++)
typedef long long ll;
const int N=1e6+7;
ll n,a[N],d[N];//a数组代表能照亮的范围,b是a的差分数组
//分成前后两端进行赋值,只有为0的没有被照亮 
void solve() {
	cin>>n;
	rep(i,1,n) {
		cin>>a[i];
	}
	int ans=0;
	rep(i,1,n) {
		if(i-a[i]<1)//如果下标小于开始值就从1开始(越界) 
		 d[1]+=1;
		else
		d[i-a[i]]+=1; //他的位置减掉发光范围就是开始亮的位置 (没有越界就从当前位置开始) 
		d[i]-=1;//左边范围的右边界 
		d[i+1]+=1; 
		if (i+a[i]+1>1000000)//右边范围的左边界(越界)
		continue; 
		d[i+a[i]+1]-=1;
	}
	rep(i,1,n) {
		d[i]+=d[i-1];//还原数组a[i],如果a[i]!=0说明他亮 
		if(d[i])
		ans++;
	}
	cout<<ans;
}
int main() {
	solve();
	return 0;
}

 

奶牛的寿命(位运算)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

    上帝养了一头奶牛,但是有一天奶牛偷吃了上帝草药,上帝十分生气于是奶牛必须要去地狱接受惩罚,上帝给了奶牛一个长达n的刑期但是同样允许奶牛对刑期进行最多操作log2(n)+1次,每次操作可以交换刑期的二进制形式下任意的两个位置上的数字,但是不能改变原来的二进制数的位数(不能有前导零),奶牛自然希望可以尽可能多的减刑,请问出奶牛最多可以减少多少刑期?

输入描述:

 

一个正整数n表示奶牛当前刑期。

(n<2^31)

输出描述:

一个整数表示奶牛最多可以减少的刑期。

示例1

输入

14

输出

3

说明

只需要交换第1位和第3位,14(1110)-->11(1011),14-11=3。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
const int N=2e5+7;
typedef long long ll;
ll n,t,sum,cnt0;
int main() {
	cin>>n;
	t=n;
	while (t){
	if((t&1)==0)
		++cnt0;//一共几个零 
		t>>=1;
	}
	int x=log2(n);//除第一位一共有x位 
	int y=x-cnt0;//除第一个1外的所有1 
	int z=1; 
	for (int i=1;i<=y;i++) {
		sum+=z;
		z*=2;//把所有1当低位算 
	} 
	sum+=pow(2,x);//第一位的十进制 
	cout<<n-sum; 
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值