CF教育场58 + 67

58场
A题:
求不在[l,r]内的数并且可以除于d,当d<l || d < r时就直接输出,然后只剩下判断d>r
的部分。r-r%d(r减去r比d多出的部分,则该数可被d除再加上d就为答案)

#include <cstdio>
int main(){
	int n , l , r , d ; 
	scanf ("%d",&n) ;
	while(n--){
		scanf ("%d%d%d",&l,&r,&d);
		if (d < l || d > r)		printf ("%d\n",d) ;
		else
			printf ("%d\n",d+(r-r%d)) ;
	}
	return 0 ; 
}

B题:
题意:给出一串字符串,求形如[:|||:]的长度,这里[] ::要配对然后再加上中间|的数,(一开始理解为括号配对。。。)从前面搜索“[” 和“[”后面第一个“:”,再从后面找出第一个“[” 和“[”前面面第一个“:”,然后计算中间的‘|’数量最后加上4即可(“[]” 和": :")

#include <cstdio> 
#include <iostream>
#include <stack>
#include <cstring> 
using namespace std ; 
int main(){
	int len = 0 ;
	string ch ; 
	cin >> ch ; 
	int a = 0 , b = 0 ; 
	for (int i = 0 ; i < ch.size() ; ++ i){
		if (ch[i] == '['){
			for (int j = i+1 ; j < ch.size() ; ++ j){
				if (ch[j] == ':'){
					a = j ; 
					break ; 
				}
			}
			break ; 
		}
	}
	if (a > 0){
		for (int i = ch.size()-1 ; i > a ; -- i){
			if (ch[i] == ']'){
				for (int j = i-1 ; j > a ; --j){
					if (ch[j] == ':'){
						b = j ; 
						break ; 
					} 
				}
				break ; 
			}
		}
	}
	
	if (a < b){
		for (int i = a+1 ; i < b ; ++ i)
			if (ch[i] == '|')
				++len ; 
		printf ("%d\n",len+4) ;
	}
	else    printf("-1\n") ;  
	return 0 ; 
}

E题:
题意:+ 时加上一张x * y的账单,?询问 x * y的钱包能不能装下所有的账单。
用h存当前账单的最长宽度,w存最长高度。x y输入时x为大的数,否则交换然后判断即可。

#include <cstdio> 
int main(){
	int n ;
	int x , y , h = 0 , w = 0 ;
	char ch ;  
	scanf ("%d",&n) ;
	getchar() ;
	while(n --){
		scanf ("%c %d %d",&ch,&x,&y) ;
		getchar() 
		;if (y > x){
			int t = x ; 
			x = y ; 
			y = t ; 
		}
		if (ch == '?'){
			if (x>=h && y >= w)		printf ("YES\n") ;  
			else	printf ("NO\n") ;
		}
		else{
			h = h>x ? h : x ; 
			w = w>y ? w : y ;
		}
	}	
	return 0 ;
}

67场

  • A题:
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std; 
int main(){
	int p ; 
	cin >> p ; 
	while(p--){
		long long n , s , t ;
		cin >> n >> s >> t ; 
		if (n==s && n==t)	cout << "1" << endl ; 
		else if (s==n)	cout << n-t+1 << endl ;
		else if (t==n)	cout << n-s+1 << endl ;	 
		else if (s+t >= n){
			cout << n-min(s,t)+1 << endl ; 
		}
		else{
			cout << n-max(s,t)+1 << endl ;
		}
	}
	return 0 ; 
}

可直接化简为:

#include <cstdio>
#include <algorithm>
using namespace std; 
int main(){
	int p ; 
	scanf ("%d",&p) ;
	while(p--){
		int n , s , t ;
		scanf ("%d%d%d",&n,&s,&t) ;
		if (n==s && n==t)	printf ("1\n") ; 
		else	printf ("%d\n",n-min(s,t)+1) ; 
	}
	return 0 ; 
}
  • B题:

给出字符串s,然后再给出m个字符串,求最短包含t的所有字母的s的长度。
做法:用一个vis不定数组存储s中每个字母出现的下标,用p存放t每个字母出现的次数,然后用p的次数索引vis出当前字母出现的下标,用pos存放最大值。

#include <cstring>
#include <iostream>
#include <vector>
using namespace std ; 
vector<int> vis[26] ; 
int f[30] ; //记录t字符串每个字母出现的次数 
int main(){
	ios::sync_with_stdio(false);
	string s , t ; 
	int n , m ; 
	cin >> n ; 
	cin >> s ; 
	for (int i = 0 ; i < s.size() ; ++ i){
		vis[s[i] - 'a'].push_back(i) ; 	//存放每一个字母出现的下标 
	}
	cin >> m ; 
	while(m --){
		cin >> t ;
		int pos = 0 ;  
		memset(f,0,sizeof(f)) ;  
		if (t.size() == s.size()){
			cout << t.size() << endl ; 
			continue ; 
		}
		for (int i = 0 ; i < t.size(); ++ i){
			int cur = t[i] - 'a' ;
			pos = max(pos,vis[cur][f[cur]++]) ; 
		}
		cout << pos+1 << endl ; 
	}
	return 0 ; 
}
基于51单片机,实现对直流电机的调速、测速以及正反转控制。项目包含完整的仿真文件、源程序、原理图和PCB设计文件,适合学习和实践51单片机在电机控制方面的应用。 功能特点 调速控制:通过按键调整PWM占空比,实现电机的速度调节。 测速功能:采用霍尔传感器非接触式测速,实时显示电机转速。 正反转控制:通过按键切换电机的正转和反转状态。 LCD显示:使用LCD1602液晶显示屏,显示当前的转速和PWM占空比。 硬件组成 主控制器:STC89C51/52单片机(与AT89S51/52、AT89C51/52通用)。 测速传感器:霍尔传感器,用于非接触式测速。 显示模块:LCD1602液晶显示屏,显示转速和占空比。 电机驱动:采用双H桥电路,控制电机的正反转和调速。 软件设计 编程语言:C语言。 开发环境:Keil uVision。 仿真工具:Proteus。 使用说明 液晶屏显示: 第一行显示电机转速(单位:转/分)。 第二行显示PWM占空比(0~100%)。 按键功能: 1键:加速键,短按占空比加1,长按连续加。 2键:减速键,短按占空比减1,长按连续减。 3键:反转切换键,按下后电机反转。 4键:正转切换键,按下后电机正转。 5键:开始暂停键,按一下开始,再按一下暂停。 注意事项 磁铁和霍尔元件的距离应保持在2mm左右,过近可能会在电机转动时碰到霍尔元件,过远则可能导致霍尔元件无法检测到磁铁。 资源文件 仿真文件:Proteus仿真文件,用于模拟电机控制系统的运行。 源程序:Keil uVision项目文件,包含完整的C语言源代码。 原理图:电路设计原理图,详细展示了各模块的连接方式。 PCB设计:PCB布局文件,可用于实际电路板的制作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值