专栏文章

【LGR-251-Div.4】洛谷入门赛 #40

题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minkrddw
此快照首次捕获于
2025/12/02 04:01
3 个月前
此快照最后确认于
2025/12/02 04:01
3 个月前
查看原文

前情提要,因为被-S的二分吓哭了于是找点题练练手感

T1 小学奥数 答案为(n1)(m1)1(n-1)*(m-1)-1
CPP
#include<cstdio>
using namespace std;
namespace Main{
	int n,m;
	inline void main(){
		scanf("%d%d",&n,&m);
		printf("%d",(n-1)*(m-1)-1);
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T2 sort一遍懒得写if,注意如果没有复合的就输出排序后第二个元素在原来数组中的下标
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
namespace Main{
	int k,res=-1;
	int s[3],w[3];
	inline void main(){
		scanf("%d%d%d%d",&s[0],&s[1],&s[2],&k);
        w[s[0]]=0,w[s[1]]=1,w[s[2]]=2;
		for(int i=0;i<=2;i++){
			res=s[i]==k?i:res;
		}
		sort(s,s+3);
		for(int i=1;i<=2;i++){
			if(s[i]==s[i-1]){
				printf("Report");
				return ;
			}
		}
        if(!(~res)){
            res=w[s[1]];
        }
		printf("%c",(char)('A'+res));
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T3 按位拆分数字,判断删除末尾的0后有几位数字即可
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
namespace Main{
	int n;
	inline void main(){
		scanf("%d",&n);
		if(n>=1&&n<=10){
			printf("Yes");
		}
		else{
			int cnt=0;
			while(n){
				cnt+=(bool)(n%10);
				n/=10;
			}
			printf(cnt==1?"Yes":"No");
		}
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T4 set统计,s[i]表示i出现过的所有下表,s[i].size代表i的出现次数,无解Error,有解答案即为s[m][k-1]
CPP
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
namespace Main{
	const int N=5050;
	int n,k,m;
	vector<int> s[N];
	inline void main(){
		scanf("%d",&n);
		for(int i=1,x;i<=n;i++){
			scanf("%d",&x);
			s[x].push_back(i);
		}
		scanf("%d%d",&k,&m);
		if(s[m].size()<k){
			printf("Error");
			return ;
		}
		printf("%d",s[m][k-1]);
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T5 不使用数组的情况下对于任意i判断奇偶性,注意i要从2开始并且要存储上一个输入的数
CPP
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
namespace Main{
	int T,n;
	inline void main(){
		scanf("%d",&T);
		while(T--){
			scanf("%d",&n);
			int lst;
			bool flag=0;
			scanf("%d",&lst);
			for(int i=2,x;i<=n;i++){
				scanf("%d",&x);
				if(i&1){
					flag=max(flag,lst==x);
				}
				else{
					flag=max(flag,lst!=x);
				}
				lst=x;
			}
			puts(flag?"No":"Yes");
		}
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T6 模拟,注意取模的时候要写成(x+p)%p 防止出现负数
CPP
#include<set>
#include<cstdio>
#include<algorithm>
using namespace std;
namespace Main{
	const int N=3010;
	int n,q;
	int s[N];
	set<int> st;
	inline void main(){
		scanf("%d%d",&n,&q);
		for(int i=1;i<=n;i++){
			scanf("%d",&s[i]);
		}
		while(q--){
			int p;
			scanf("%d",&p);
			for(int i=1;i<=n;i++){
				st.insert((s[i]+p)%p);
			}
			printf("%d\n",st.size());
			st.clear();
		}
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T6 先找出那个整数,接着从右向左模拟,遇到'[',']'均跳过,a数组就cnt=a[cnt],b数组就cnt=b[cnt],注意下标处理即可
CPP
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
namespace Main{
	const int N=1e5+7;
	int n,cnt;
	char s[N];
	int a[N],b[N];
	inline void main(){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		for(int i=1;i<=n;i++){
			scanf("%d",&b[i]);
		}
		scanf("%s",s+1);
		int len=strlen(s+1);
		for(int i=1;i<=len;i++){
			if(s[i]>='0'&&s[i]<='9'){
				while(s[i]>='0'&&s[i]<='9'){
					cnt=(cnt<<1)+(cnt<<3)+(s[i]^48);
					++i;
				}
				break;
			}
		}
		for(int i=len;i;--i){
			while(s[i]==']'||s[i]=='['){
				--i;
			}
			if(s[i]=='a'){
				cnt=a[cnt];
			}
			else if(s[i]=='b'){
				cnt=b[cnt];
			}
		}
		printf("%d",cnt);
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}
T7 从上往下模拟,用vector存储箱子的字符,遇到障碍就从障碍上方向上枚举,放置,注意最后如果还有箱子没放要从最底下往上放
使用vector而不是stack的原因是vector有clear函数stack没有,下标处理麻烦点但是写着舒服
CPP
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
namespace Main{
	const int N=1e5+7;
	int n,m;
	char s[20][N];
	vector<char> q;
	inline void main(){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++){
			scanf("%s",s[i]+1);
		}
		for(int i=1;i<=n;i++){
			puts(s[i]+1);
		}
		for(int j=1;j<=m;j++){
			for(int i=1;i<=n;i++){
				if(s[i][j]>='A'&&s[i][j]<='Z'){
					q.push_back(s[i][j]);
					s[i][j]='.';
				}
				else if(s[i][j]=='-'){
					for(int k=i-1;k<=i-q.size();k--){
						s[k][j]=q[q.size()+k-i];
					}
					q.clear();
				}
			}
			if(!q.empty()){
				for(int k=n;k<=n-q.size()+1;k--){
					s[k][j]=q[q.size()+k-n-1];
				}
				q.clear();
			}
		}
		for(int i=1;i<=n;i++){
			puts(s[i]+1);
		}
		return ;
	}
}
signed main(){
	Main::main();
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...