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;
}