【LGR-172-Div.4】洛谷入门赛 #19(A—H,c++详解!)

news2024/9/24 17:41:12

文章目录

  • 【LGR-172-Div.4】洛谷入门赛 #19
  • A.分饼干 I
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
      • 样例解释 1
      • 样例解释 2
      • 数据范围与约定
      • 思路:
    • 代码
  • B.分饼干 II
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
      • 数据规模与约定
    • 思路
    • 代码
  • C.跳房子
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
      • 样例 1 解释
      • 样例 2 解释
      • 数据规模与约定
    • 思路
    • 代码
  • D 区间函数最小值
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 样例解释 #1
      • 数据规模与约定
    • 思路
    • 代码
  • E.小跳蛙
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 样例解释 #1
      • 数据规模与约定
    • 思路
    • 代码
  • F.图像变换
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 数据规模与约定
    • 思路
    • 代码
  • G.二进制与一
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 样例 1 说明
      • 数据规模与约定
    • 思路
    • 代码
  • H.Genshin 玩家
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 样例 #2
      • 样例输入 #2
      • 样例输出 #2
    • 提示
      • 数据规模与约定
    • 思路
    • 代码
  • 总结:


【LGR-172-Div.4】洛谷入门赛 #19

A.分饼干 I

题目描述

洛谷网校举行了期末考试,同学们经过课程的学习,考出了优异的成绩。

Z 在考试中获得了第一名,yz 在考试中获得了第二名,老师决定买一些饼干奖励两名小朋友。

老师买了三盒饼干,第一盒有 a a a 块饼干,第二盒有 b b b 块饼干,第三盒有 c c c 块饼干。老师决定将这三盒饼干奖励给 Z 和 yz,三盒饼干不可以被拆开奖励。

老师希望 Z 拿到的饼干块数不少于 yz,但又希望两人拿到的饼干数量差距尽可能小,请问 Z 和 yz 各拿到几块饼干?

输入格式

输入一行三个整数,分别为 a , b , c a,b,c a,b,c

输出格式

输出一行两个整数,由空格分隔。第一个整数代表 Z 拿到的饼干数量,第二个整数代表 yz 拿到的饼干数量。

样例 #1

样例输入 #1

3 1 5

样例输出 #1

5 4

样例 #2

样例输入 #2

3 3 5

样例输出 #2

6 5

提示

样例解释 1

Z 拿走 5 5 5 块饼干,yz 拿走 3 + 1 = 4 3+1=4 3+1=4 块饼干。

样例解释 2

Z 拿走 3 + 3 = 6 3+3=6 3+3=6 块饼干,yz 拿走 5 5 5 块饼干。

数据范围与约定

  • 对于 30 % 30\% 30% 的测试数据, a = b = c a=b=c a=b=c
  • 对于 100 % 100\% 100% 的测试数据, 1 ≤ a , b , c ≤ 1000 1 \le a,b,c \le 1000 1a,b,c1000

思路:

题目有两个要求,最重要的是Z 拿到的饼干块数不少于 yz!!!在满足前者的前提下第二个要求是希望两人拿到的饼干数量差距尽可能小。

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
int a[4];

void solve(){
    repn(i,1,3) cin>>a[i];
    sort(a+1,a+4);
	int ans1,ans2;
	if(a[1]+a[2]!=a[3]){//两个小的加起来和最大的不相等,取较大值的已给第一名
		if(a[1]+a[2]>a[3]){
			ans1=a[1]+a[2];
			ans2=a[3];
		}else{
			ans1=a[3];
			ans2=a[1]+a[2];
		}
	}else{//!!!两者相等时,题目要求了Z 拿到的饼干块数不少于 yz
		ans1=a[3]+a[1];//有要求两者差距尽可能小,所以我们拿一个最大的和一个最小的
		ans2=a[2];
	}
	cout<<ans1<<' '<<ans2;
} 

signed main(){
//	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

B.分饼干 II

题目描述

老师有 N N N 块饼干,要分给 k k k 名小朋友。

每名小朋友至少拿到一块饼干,老师想让每名小朋友拿到的饼干数量都不一样多,请问老师能否实现这个目标。

输入格式

本题单个测试点内有多组测试数据。

输入共 T + 1 T + 1 T+1 行。

输入第一行为一个整数 T T T,代表测试数据组数。
接下来 T T T 行,每行两个整数,分别为 N , k N,k N,k

输出格式

输出共 T T T 行,依次对应 T T T 组测试数据。如果该组测试数据

  • 可以实现,输出 Yes
  • 无法实现,输出 No

样例 #1

样例输入 #1

1
1 1

样例输出 #1

Yes

样例 #2

样例输入 #2

1
5 3

样例输出 #2

No

提示

数据规模与约定

  • 对于 50 % 50\% 50% 的测试数据 1 ≤ k ≤ 1000 1 \le k \le 1000 1k1000 1 ≤ N ≤ 1 0 6 1 \le N \le 10^6 1N106
  • 对于 100 % 100\% 100% 的测试数据, 1 ≤ k , N ≤ 1 0 9 1 \le k,N \le 10^9 1k,N109

思路

  • 题意大概是N块饼干分给k个小朋友,每个小朋友至少拿一块饼干,并且,内每个小朋友拿到的饼干数量都不一样。
  • 既然每个小朋友分到的数量都不一样,那我们不妨从1个饼干开始分,1,2,3,······,k. 这样就保证了每个小朋友分到的数量都不一样。不难发现这是一个等差数列,我们根据等差数列求和公式得到总和sum,如果sum>n,说明饼干太少啦>﹏<,根本不够分啊!如果sum<=n,我们就可以分成k份,保证了两两各不相同。

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 

void solve(){
    int n,k;
    cin>>n>>k;
    if(n==1) {//注意特判一下
	  cout<<"Yes"<<endl;
	  return ;
    }  
    int sum=(1+k)*k/2;
    if(sum>n) cout<<"No"<<endl;
    else cout<<"Yes"<<endl;
	
		
} 

signed main(){
//	IOS;
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

C.跳房子

题目背景

跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一,趣味性、娱乐性极强,曾深受广大儿童的喜爱。

题目描述

现在我们给出一种简易跳房子游戏的玩法:

n n n 个格子从左到右一字形排开,从左到右依次被标号为 1 , 2 , ⋯   , n 1, 2, \cdots, n 1,2,,n。每一个格子上都有一个正整数, i i i 号格子上的正整数是 a i a _ i ai

这个游戏的规则如下:初始时玩家站在 1 1 1 号格子上,需要做若干次跳跃。每一次跳跃时,玩家需要从当前格子向前跳「当前格子上写的整数」数量的格子。形式化地讲,如果玩家当前处于 x x x 号格子,玩家需要跳到 x + a x x + a _ x x+ax 号格子上。

如果玩家跳到 n n n 号格子右侧的位置,称玩家出界;如果玩家恰好跳到 n n n 号格子上,称玩家胜利。这两种情况下玩家都需要停止跳跃。

现在给定格子数量和格子上的整数,你需要求解:

  1. 在停止跳跃后,玩家是否胜利。即,玩家是否能够恰好跳到 n n n 号格子上。
  2. 在停止跳跃后,玩家跳跃的总次数。

输入格式

输入共两行。

第一行为一个整数 n n n,代表格子的数量。
第二行为 n n n 个整数 a 1 , a 2 , ⋯   , a n a _ 1, a _ 2, \cdots, a _ n a1,a2,,an,代表每个格子上的数字。

输出格式

输出共两行。

第一行为一个字符串。如果玩家在停止跳跃后恰好跳到 n n n 号格子上,输出 Yes,否则输出 No
第二行一个整数,代表玩家的总跳跃次数。

样例 #1

样例输入 #1

6
1 1 3 7 8 5

样例输出 #1

Yes
3

样例 #2

样例输入 #2

4
2 7 3 5

样例输出 #2

No
2

提示

样例 1 解释

样例 2 解释

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 6 1 \leq n \leq 10 ^ 6 1n106 1 ≤ a i ≤ 1 0 4 1 \leq a _ i \leq 10 ^ 4 1ai104

测试点编号 n n n特殊性质
1 1 1 = 1 = 1 =1
2 ∼ 4 2 \sim 4 24 ≤ 100 \leq 100 100
5 5 5 ≤ 1 0 6 \leq 10 ^ 6 106 a i = 1 a _ i = 1 ai=1
6 , 7 6, 7 6,7 ≤ 1 0 6 \leq 10 ^ 6 106 a i = 2 a _ i = 2 ai=2
8 ∼ 10 8 \sim 10 810 ≤ 1 0 6 \leq 10 ^ 6 106

思路

模拟题,按照题目要求模拟即可,具体步骤请看代码

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 2e6+10, INF=1e18+10;
int a[N];

void solve(){
    int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	int res=0,i=1,now=1;
	if(n==1){//特判!!!
		cout<<"Yes"<<endl;
		cout<<0<<endl;
		return ;
	}
	while(1){
		now+=a[i];//移动a[i]步
		i+=a[i];//注意下标也要加a[i]
		res++;//步数加1
		if(now==n){//到达终点,游戏结束!
			cout<<"Yes"<<endl;
			cout<<res;
		    return;
		}
		//cout<<now<<' '<<i<<endl;
		if(now>n) break;//越界,游戏结束!
	}
 	cout<<"No"<<endl;
 	cout<<res;
} 

signed main(){
//	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

D 区间函数最小值

题目描述

给定 A , B , C , D , E , F , G , P , X 1 , X 2 , Y 1 , Y 2 A, B, C, D, E, F, G, P, X_1, X_2, Y_1, Y_2 A,B,C,D,E,F,G,P,X1,X2,Y1,Y2,求当 X 1 ≤ x ≤ X 2 X _ 1 \leq x \leq X _ 2 X1xX2 Y 1 ≤ y ≤ Y 2 Y _ 1 \leq y \leq Y _ 2 Y1yY2 x , y x, y x,y 均为整数时

f ( x , y ) = ( A x 3 + B y 3 + C x 2 y + D x y 2 + E x y + F x + G y )   m o d   P f(x, y) = (A x ^ 3 + B y ^ 3 + C x ^ 2 y + Dxy ^ 2 + Exy + Fx + Gy) \bmod P f(x,y)=(Ax3+By3+Cx2y+Dxy2+Exy+Fx+Gy)modP

的最大值。

输入格式

输入共一行十二个整数 A , B , C , D , E , F , G , P , X 1 , X 2 , Y 1 , Y 2 A, B, C, D, E, F, G, P, X_1, X_2, Y_1, Y_2 A,B,C,D,E,F,G,P,X1,X2,Y1,Y2

输出格式

输出一个整数,代表 f ( x , y ) f(x, y) f(x,y) 的最大值。

样例 #1

样例输入 #1

3 2 5 6 1 4 2 998244353 1 2 1 3

样例输出 #1

266

提示

样例解释 #1

x x x 1 1 1 2 2 2 之间的整数, y y y 1 1 1 3 3 3 之间的整数时,函数 f ( x , y ) f(x,y) f(x,y) 的值如下:

f ( 1 , 1 ) = 23 ,   f ( 1 , 2 ) = 63 ,   f ( 1 , 3 ) = 139 f ( 2 , 1 ) = 70 ,   f ( 2 , 2 ) = 144 ,   f ( 2 , 3 ) = 266 f(1,1)=23,\ f(1,2)=63,\ f(1,3)=139\\ f(2,1)=70,\ f(2,2)=144,\ f(2,3)=266 f(1,1)=23, f(1,2)=63, f(1,3)=139f(2,1)=70, f(2,2)=144, f(2,3)=266

最大值为 f ( 2 , 3 ) f(2,3) f(2,3),即 266 266 266

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 1 ≤ A , B , C , D , E , F , G , P ≤ 1 0 9 1 \leq A, B, C, D, E, F, G, P \leq 10 ^ 9 1A,B,C,D,E,F,G,P109 1 ≤ X 1 ≤ X 2 ≤ 1 0 3 1 \leq X _ 1 \leq X _ 2 \leq 10 ^ 3 1X1X2103 1 ≤ Y 1 ≤ Y 2 ≤ 1 0 3 1 \leq Y _ 1 \leq Y _ 2 \leq 10 ^ 3 1Y1Y2103

思路

遍历一遍(x,y)即可,刚开始以为是个数论题哈哈,吓得直接跳过了,回头一看数据范围x,y只有1e3,也就是说暴力的话时间复杂度为O(n^2),1e6不会超时间限制!

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 2e5+10, INF=1e18+10;
int a,b,c,d,e,f,g,p,X1,X2,Y1,Y2;

int calc(int x,int y){
	return (a*x*x*x+b*y*y*y+c*x*x*y+d*x*y*y+e*x*y+f*x+g*y)%p; 
}

void solve(){
    cin>>a>>b>>c>>d>>e>>f>>g>>p>>X1>>X2>>Y1>>Y2;
    int res=0;
    for(int i=X1;i<=X2;i++)
      for(int j=Y1;j<=Y2;j++){
      	res=max(res,calc(i,j));
	  }
	cout<<res<<endl;
		
} 

signed main(){
//	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

E.小跳蛙

题目背景

idea 提供者: bj12z_jiasiyuan

验题:卷王

题目描述

n − 1 n - 1 n1 只小跳蛙在池塘中,依次被编号为 1 , 2 , ⋯   , n − 1 1, 2, \cdots, n - 1 1,2,,n1。池塘里有 n n n 个位置,每一个位置上有一个数字 a i a_i ai。如果 a i = 0 a_i = 0 ai=0,则表示这个位置是一个空位;否则表示这个位置上存在一个编号为 a i a_i ai 的小跳蛙。

接下来的 n − 1 n-1 n1 分钟,小跳蛙们将进行跳跃。第 i i i 分钟,编号为 i i i 的小跳蛙将跳到空位上。

请你输出 n − 1 n-1 n1 分钟后池塘中每个位置的数字,即每个位置是否为空、小跳蛙编号是多少。

输入格式

输入共两行。

第一行一个整数 n n n
第二行 n n n 个整数 a 1 , a 2 , ⋯   , a n a _ 1, a _ 2, \cdots, a _ n a1,a2,,an

输出格式

输出一行 n n n 个整数 a 1 , a 2 , ⋯   , a n a _ 1, a _ 2, \cdots, a _ n a1,a2,,an。 表示 n − 1 n-1 n1 分钟后池塘的状态。

样例 #1

样例输入 #1

5
1 2 0 3 4

样例输出 #1

2 3 1 4 0

提示

样例解释 #1

  • 第一分钟后池塘状态:0 2 1 3 4
  • 第二分钟后池塘状态:2 0 1 3 4
  • 第三分钟后池塘状态:2 3 1 0 4
  • 第四分钟后池塘状态:2 3 1 4 0

因此最终池塘的状态为 2 3 1 4 0

数据规模与约定

对于 50 % 50\% 50% 的数据, 1 ≤ n ≤ 1 0 3 1 \leq n \leq 10 ^ 3 1n103

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1n106,保证序列 a a a 是一个 0 ∼ n − 1 0 \sim n - 1 0n1 这些数字的排列。

思路

可以用map记录编号对应的下标,第i分钟就让编号为i的蛤蟆与空位(即编号0)交换位置

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 1e6+10, INF=1e18+10;
int n,a[N];
unordered_map<int,int> mp;//编号->下标的映射

void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
    	mp[a[i]]=i;
	}
	for(int i=1;i<=n;i++){
		int x=mp[i];//编号为i的下标
		int y=mp[0];//编号为0的下标
		swap(a[x],a[y]);//交换位置
		mp[0]=x;
		mp[i]=y;
//		for(int i=1;i<=n;i++)
//		cout<<a[i]<<' ';

//		cout<<endl;
	}
	for(int i=1;i<=n;i++)
		cout<<a[i]<<' ';
} 

signed main(){
	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

F.图像变换

题目描述

一张字符图片由 n n n m m m 列,共 n × m n\times m n×m 个字符组成,第 i i i 行第 j j j 列的字符为 s i , j s_{i,j} si,j。如下图所示,为一个 4 × 3 4\times 3 4×3 的字符图片。

%%%
$$$
@w@
!!!

现在,需要将图像放大 k k k 倍,得到 k n × k m kn \times km kn×km 的图片。原图片的每个字符都需要重复 k 2 k^2 k2 次,作为新图像中 k × k k\times k k×k 的一个区域,各字符的相对位置不变。

将上面给出的例子放大 2 2 2 倍,将得到如下图像:

%%%%%%
%%%%%%
$$$$$$
$$$$$$
@@ww@@
@@ww@@
!!!!!!
!!!!!!

输入格式

输入 n + 1 n+1 n+1 行。

输入的第一行为三个整数 n , m , k n,m,k n,m,k

接下来 n n n 行,每行 m m m 个字符,表示字符图片。

输出格式

输出 n k nk nk 行,每行 m k mk mk 个字符,表示变换后的字符图片。

样例 #1

样例输入 #1

4 3 2
%%%
$$$
@w@
!!!

样例输出 #1

%%%%%%
%%%%%%
$$$$$$
$$$$$$
@@ww@@
@@ww@@
!!!!!!
!!!!!!

提示

数据规模与约定

  • 对于 30 % 30\% 30% 的测试数据,输入的字符画仅包含一种字符;
  • 对于 100 % 100\% 100% 的测试数据, 1 ≤ n , m ≤ 100 1 \le n, m \le 100 1n,m100 1 ≤ k ≤ 10 1 \le k \le 10 1k10,输入的字符仅包含 ASCII 码不超过 127 的可见字符。

思路

观察样例,我们可以看出每个字符需要输出k次,横纵长度都扩大了k倍

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 2e3+10, INF=1e18+10;
int n,m,k;
char g[N][N];

void solve(){
    cin>>n>>m>>k;
    repn(i,1,n)
     repn(j,1,m) 
       cin>>g[i][j];
    for(int i=1;i<=n;i++){
    	for(int u=1;u<=k;u++){//每个字母输出k次
    	  for(int j=1;j<=m;j++){
    		for(int p=1;p<=k;p++) 
    		  cout<<g[i][j];
		  }  
		  cout<<endl;//注意换行
		}
		
	}	
} 

signed main(){
//	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

G.二进制与一

题目描述

给定一个正整数 n n n,以及操作次数 q q q。对于每次操作,给出一个正整数 k k k,要求:让 n n n 加上一个非负整数 x x x,使得 n n n 在二进制下的第 k k k 位(从右往左数)是 1 1 1,并在符合要求的情况下,令 x x x 最小。

请注意,每次操作都会让 n n n 变为 n + x n + x n+x,会影响后续操作。

小山需要求出,所有的 x x x 之和是多少。

输入格式

输入共 q + 1 q + 1 q+1 行。

第一行两个整数 n n n q q q
接下来 q q q 行,每行一个正整数 k k k,表示要让 n n n 在二进制下从右往左数的第 k k k 位是 1 1 1

输出格式

一行一个整数,表示所有的 x x x 之和。

样例 #1

样例输入 #1

5 3
2
3
4

样例输出 #1

3

提示

样例 1 说明

5 5 5 在二进制下是 101 101 101

  • 对于第一次操作,需要让 101 101 101 的第二位变为 1 1 1,则需让 101 101 101 加上 1 1 1,变为 110 110 110
  • 对于第二次操作,需要让 110 110 110 的第三位是 1 1 1,由于 110 110 110 的第三位本身就是一,所以无需改变;
  • 第三次操作同理,需要让 110 110 110 加上 2 2 2

最终输出结果是 1 + 0 + 2 = 3 1+0+2=3 1+0+2=3

数据规模与约定

对于 100 % 100\% 100% 的数据, 1 ≤ n < 2 32 , 1 ≤ q ≤ 1 0 5 , 1 ≤ k ≤ 32 1\le n < 2^{32},1\le q\le 10^5,1 \le k\le 32 1n<2321q1051k32

测试点编号 n n n q q q k k k
1 1 1 ≤ 4 \leq 4 4 ≤ 10 \leq 10 10 ≤ 2 \leq 2 2
2 , 3 2, 3 2,3 ≤ 4 \leq 4 4 ≤ 10 \leq 10 10 ≤ 32 \leq 32 32
4 , 5 4, 5 4,5 ≤ 1024 \leq 1024 1024 ≤ 1000 \leq 1000 1000 ≤ 10 \leq 10 10
6 , 7 6, 7 6,7 < 2 32 < 2 ^ {32} <232 ≤ 10 \leq 10 10 ≤ 32 \leq 32 32
8 ∼ 10 8 \sim 10 810 < 2 32 < 2 ^ {32} <232 ≤ 1 0 5 \leq 10 ^ 5 105 ≤ 32 \leq 32 32

思路

考察的二进制位运算,手写一下我们发现我们需要取后k位,那么该怎么取呢?比如n=6,二进制是110去后两位,1<<2是100,此时再减一变为011,在与上n为010,即可取得后两位,取后k位亦是如此。
再用1<<(k-1)减去n的后k位即为让从右往左数的第 k 位变为 1差的值。

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 2e5+10, INF=1e18+10;

void solve(){
    int n,q,sum=0;
    cin>>n>>q;
    while(q--){
    	int k;
    	cin>>k;
    	//cout<<n<<' '<<(1<<(k-1))<<endl;
    	if(n&(1LL*1<<(k-1))) continue;//已经是1 
    	int x=(1LL*1<<(k-1))-n&((1LL*1<<k)-1);
    	n+=x;
    	sum+=x;
    	//cout<<"**"<<x<<endl;
	}
	cout<<sum;
		
} 

signed main(){
//	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

H.Genshin 玩家

题目背景

你说得对,后面忘了。

题目描述

在洛谷入门赛/语言月赛出题 QQ 群里,著名洛谷管理员蓝边铅球老师的群名片是『原神玩家』。

现在,扶苏给了你一个字符串 s s s,她想请你求出:有多少种方案可以在 s s s 中取出两个子串 s [ l 1 , r 1 ] , s [ l 2 , r 2 ] s[l_1, r_1], s[l_2, r_2] s[l1,r1],s[l2,r2],满足:

  • 1 ≤ l 1 ≤ r 1 ≤ l 2 ≤ r 2 ≤ ∣ s ∣ 1 \leq l_1 \leq r_1 \leq l_2 \leq r_2 \leq |s| 1l1r1l2r2s,这里 ∣ s ∣ |s| s 表示字符串 s s s 的长度。
  • s [ l 1 , r 1 ] s[l_1, r_1] s[l1,r1] 表示由 s s s 的第 l 1 l_1 l1 个字符到第 r 1 r_1 r1 个字符构成的字符串, s [ l 1 , r 1 ] = Genshin s[l_1, r_1] = \texttt{Genshin} s[l1,r1]=Genshin
  • s [ l 2 , r 2 ] s[l_2, r_2] s[l2,r2] 表示由 s s s 的第 l 2 l_2 l2 个字符到第 r 2 r_2 r2 个字符构成的字符串, s [ l 2 , r 2 ] = player s[l_2, r_2] = \texttt{player} s[l2,r2]=player

两个方案不同,当且仅当两个方案中 l 1 , r 1 , l 2 , r 2 l_1, r_1, l_2, r_2 l1,r1,l2,r2 至少有一个对应不同。

输入格式

输入只有一行,表示字符串 s s s

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

Genshinplayerplayer

样例输出 #1

2

样例 #2

样例输入 #2

ExpectedIsAGenshinplayerWhoLikesToBeAGenshinplayer

样例输出 #2

3

提示

数据规模与约定

  • 30 % 30\% 30% 的数据,保证 ∣ s ∣ ≤ 50 |s| \leq 50 s50
  • 60 % 60\% 60% 的数据,保证 ∣ s ∣ ≤ 200 |s| \leq 200 s200
  • 100 % 100\% 100% 的数据,保证 1 ≤ ∣ s ∣ ≤ 2000 1 \leq |s| \leq 2000 1s2000 s s s 中仅含大小写英文字母。

思路

主要就是找字串再在主串中出现的次数,先找s1=“Genshin”,然后再找s2="player"出现的次数,然后再找下一个s1,以及下一个s1后面s2出现了多少次,直到找不到s1。这里用find函数来查找子串。其实也可以用kmp算法求字串,不过有点麻烦,属实是杀鸡用牛刀了( ̄︶ ̄)。

代码

#include<bits/stdc++.h>
using namespace std;

#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long 
#define repn(i,o,n) for(int i=o;i<=n;i++)
#define rep(i,o,n) for(int i=o;i<n;i++)
const int N = 2e5+10, INF=1e18+10;
string s1="Genshin",s2="player";

void solve(){
	string s;
	cin>>s;
	int res=0;
	int pos1=s.find(s1,0);
	while(s.find(s1,pos1)!=-1){
		if(pos1!=-1){
			int pos2=s.find(s2,pos1),num=0;
			while(s.find(s2,pos2)!=-1){
				num++;
				pos2=s.find(s2,pos2+1);
			}
			res+=num; 
//			cout<<num<<endl;
		}
		pos1=s.find(s1,pos1+1);
	}	
	cout<<res;
} 

signed main(){
//	IOS;
	int T=1;
//	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
/*


*/

总结:

本次比赛难度只有div4,但比赛中好几道没有全过,甚至有的只过了两三个点(H)。

  • 第一题分饼干I就想了好几分钟,脑子不清醒,写了一堆还有两三个点没过,赛后又想了想发现没有考虑到Z 拿到的饼干块数不少于 yz这个点,属于没认真读题了。
  • 第二题想了想可以用等差数列求和做,没卡多久。
  • 跳房子模拟就行,wa了两发,下标没有加a[i[值。
  • 小跳蛙比赛时没想出来,暴力做了
  • 二进制与一推了好久,属于是位运算基础不太行了
  • 最后一题思路是对的,但是实现起来出现了问题,对find函数的应用还是不太熟练啊!
  • 最后最重要的就是一个字要 稳!!!不能为了赶做题速度,从而落下题目中的关键点,还有就是脑袋要清醒啊,不能迷迷糊糊做题是吧,有的题比赛做不出来,赛后一想就知道思路了,归根结底还是没有深思熟虑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC基础知识学习笔记

Universe Infinity Inc. 目录 一、学习SpringMVC主要是学什么1、SpringMVC的基本原理2、SpringMVC学习串联 二、快速体验SpringMVC的开发1、新建项目&#xff0c;转成web项目2、引入依赖3、编写Spring的配置类4、配置web启动类&#xff0c;替代web.xml5、编写Handler&#xff…

助力焊接场景下自动化缺陷检测识别,基于YOLOv3模型开发构建工业焊接场景下缺陷检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

令牌桶算法与Guava的实现RateLimiter源码分析

令牌桶算法与Guava的实现RateLimiter源码分析 令牌桶RateLimiter简介RateLimiter使用示例导入maven依赖编写测试代码 RateLimiter的实现源码解析SmoothRateLimiterSmoothBursty恒速获取令牌acquire(int)tryAcquire(int,long,TimeUnit) 存量桶系数小结 优缺点与漏桶的区别总结 令…

01-开始Rust之旅

1. 下载Rust 官方推荐使用 rustup 下载 Rust&#xff0c;这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要连接互联网。 这边提供了离线安装版本。本人学习的机器环境为&#xff1a; ubuntu x86_64&#xff0c;因此选用第②个工具链&#xff1b; 1. rust-1.75.0-x86_…

CloudPanel RCE漏洞复现(CVE-2023-35885)

0x01 产品简介 CloudPanel 是一个基于 Web 的控制面板或管理界面,旨在简化云托管环境的管理。它提供了一个集中式平台,用于管理云基础架构的各个方面,包括虚拟机 (VM)、存储、网络和应用程序。 0x02 漏洞概述 由于2.3.1 之前的 CloudPanel 具有不安全的文件管理器 cook…

【JSON2WEB】01 WEB管理信息系统架构设计

WEB管理信息系统分三层设计&#xff0c;分别为DataBase数据库、REST2SQL后端、JSON2WEB前端&#xff0c;三层都可以单独部署。 1 DataBase数据库 数据库根据需要选型即可&#xff0c;不需要自己设计开发&#xff0c;一般管理信息系统都选关系数据库&#xff0c;比如Oracle、…

beego的模块篇 - I18n国际化

1. i18n 安装导入 安装该模块&#xff1a; go get github.com/beego/i18n 导入引用包&#xff1a; import ("github.com/beego/i18n" ) conf 目录下就有 locale_en-US.ini 和 locale_zh-CN.ini 两个本地化文件。 本地化文件的文件名和后缀是随意的&#xff0c;不…

C++_Lambda表达式的完整介绍

目录 1. 什么是Lambda表达式 1.1 四种表达式的含义 1.2 lambda表达式各个成员的解释 2. 捕获列表 3. 编译器如何看待Lambda表达式 参考文章 参考: C Lambda表达式的完整介绍 - 知乎 c在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数&#xff0c;使得代码…

超过GPT3.5?Mixtral 8*7B 模型结构分析

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 前言 2023年12月11日&#xff0c;Mistral AI团队发布了一款高质量的稀疏专家混合模型Mixtral 8x7B。 Mistral AI继续致力于向开发者社区提供最优秀的开放模型。在人工智能领域向前发展&#xff0c;需要采取超越…

关于SpringBoot项目整合Log4j2实现自定义日志打印失效原因

主要的原因是因为&#xff0c;SpringBoot的logback包的存在&#xff0c;会导致Spring Boot项目优先实现logback的日志设置&#xff0c;所以导致我们用Log4j2实现自定义日志失效。 先找l哪个包引用了logback包 进入之后查询logback 然后双击包 发现是spring-boot-starter-loggin…

UVa1318/LA2797 Monster Trap

题目链接 本题是2003年ICPC亚洲区域赛会津(日本)赛区的H题 题意 给出一些线段障碍&#xff0c;你的任务是判断怪物能否逃到无穷远处。如下图所示&#xff0c;左图无法逃出&#xff0c;右图的可以逃出。 输入包含多组数据。每组数据第一行为整数n&#xff08;1≤n≤100&#xf…

C++编写、生成、调用so库详解(一)

开发中经常会用到so库,大多是调用第三方的so库,偶尔也需要自己封装一个so库给别人调用,这边就记录一下开发so库的一个过程. 首先我们这边是在Android Studio中开发的,所以仅描述在Android环境下开发过程,当然也可以用其他工具开发. 目录 1.第一步新建项目,配置需要的工具 2…

插件分享 Chrome浏览器实现外语翻译自由

【有道灵动翻译】使用有道翻译大模型&#xff0c;沉浸式网页翻译的首选工具&#xff01; 实时对照翻译:让任何网页变成对照。输入框即时翻译:输入中文轻松变英文。 &#x1f525;功能亮点&#x1f525;&#xff1a; 实时对照翻译&#xff1a;使用有道翻译大模型&#xff0c;无…

了解Vue中日历插件Fullcalendar

实现效果如下图&#xff1a; 月视图 周视图 日视图 官方文档地址&#xff1a;Vue Component - Docs | FullCalendar 1、安装与FullCalendar相关的依赖项 npm install --save fullcalendar/vue fullcalendar/core fullcalendar/daygrid fullcalendar/timegrid fullcalend…

MySQL复合查询 内外连接

目录 前言&#xff1a; 多表查询&#xff1a; 显示部门号为10的部门名&#xff0c;员工名和工资 : 显示各个员工的姓名&#xff0c;工资&#xff0c;及工资级别: 自连接 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号&#xff09; 子查询 单行子查询&#…

IPv6自动隧道---6to4中继

6to4中继 普通IPv6网络需要与6to4网络通过IPv4网络互通,这可以通过6to4中继路由器方式实现。所谓6to4中继,就是通过6to4隧道转发的IPv6报文的目的地址不是6to4地址,但转发的下一跳是6to4地址,该下一跳为路由器我们称之为6to4中继。隧道的IPv4目的地址依然从下一跳的6to4地…

电池容量常见测试方法分享 -纳米软件

电池容量是衡量电池性能的重要指标之一&#xff0c;它是指电池在一定条件下放出的电量&#xff0c;可以用于帮助评估电池的性能和寿命。那么如何快速测试电池容量呢? 一、用万用表测试 用万用表测试电池容量&#xff0c;需要将万用表调整到电容模式&#xff0c;然后连接电池到…

鸿蒙HarmonyOS实战-ArkTS语言(基本语法)

&#x1f680;一、ArkTS语言基本语法 &#x1f50e;1.简介 HarmonyOS的ArkTS语言是一种基于TypeScript开发的语言&#xff0c;它专为HarmonyOS系统开发而设计。ArkTS语言结合了JavaScript的灵活性和TypeScript的严谨性&#xff0c;使得开发者能够快速、高效地开发出高质量的Har…

mac PyCharm 上传文件到远程服务器+远程服务器下载到本地

1 部署配置 选择SFTP name&#xff1a;test6 输入ssh账号和密码。保存密码和30s心跳。 2 目录映射 Local path&#xff08;本地mac机器&#xff09;&#xff1a;/Users/clevercode/PycharmProjects/test6 Root path&#xff08;远程服务机器&#xff09;&#xff1a;/home/…

Redis持久化方案RDB和AOF

Redis两种持久化方案 RDB持久化AOF持久化 RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文…