23级寒假预备役第四次测试

目录

1.题目:外汇

2.题目:高桥迷路了

3.题目:和美丽的列阵​编辑

4.题目:萨沙和绘画

5.题目:萨沙和赌场

6.题目:只有两个中的一个

7.题目:村村通

8.题目:传送门


注意;1到6是按难度排序的正常题目(也可能不正常吧),7和8是算法题,第7题要用到最小生成树和并查集,第8题要用到

1.题目:外汇

输入:

4
5 7 0 3
2 2
4 3
5 2

输出:

5

输入:

10
32 6 46 9 37 8 33 14 31 5
5 5
3 1
4 3
2 2
3 2
3 2
4 4
3 3
3 1

输出:

45

也是简简单单的好吧

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
 long long a[N],b[N],c[N];
int main(){
	long long k=0,n;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<n;i++)
	cin>>b[i]>>c[i];
	for(int i=1;i<n;i++){
		if(a[i]>=b[i])
		{
			a[i+1]+=(a[i]/b[i])*c[i];
		}
	}
	printf("%lld\n",a[n]);
	return 0;
}

2.题目:高桥迷路了

输入:

6 7 5
LULDR
#######
#...#.#
##...##
#.#...#
#...#.#
#######

输出:

2

输入:

13 16 9
ULURDLURD
################
##..##.#..####.#
###.#..#.....#.#
#..##..#####.###
#...#..#......##
###.##.#..#....#
##.#####....##.#
###.###.#.#.#..#
######.....##..#
#...#.#.######.#
##..###..#..#.##
#...#.#.#...#..#
################

输出:

6

直接遍历,注意x1,y1那里是累加,不是回溯的那种搜索。写给自己看的(错的地方)。

#include<bits/stdc++.h>
using namespace std;
int n,m,t;
char a[505];
char b[505][505];
int c[505];
int ans;
int dx[6]= {0,0,0,1,-1}; //行
int dy[6]= {0,1,-1,0,0}; //列 R L D U
int main() {
	cin>>n>>m>>t;
	for(int i=1; i<=t; i++) {         //输入他要走的方向
		cin>>a[i];
		if(a[i]=='R')c[i]=1;
		else if(a[i]=='L')c[i]=2;
		else if(a[i]=='D')c[i]=3;
		else c[i]=4;
	}

	for(int i=1; i<=n; i++) {         //输入地图
		for(int j=1; j<=m; j++)
			cin>>b[i][j];
	}
	for(int i=2; i<=n-1; i++) {       //因为地图周边但是还,所以直接从2开始,到n-1,m-1结束
		for(int j=2; j<=m-1; j++) {
			if(b[i][j]=='#')continue;  //该地是海,直接跳过
			int x1=i,y1=j;
			for(int v=1; v<=t; v++) {
				x1+=dx[c[v]];
				y1+=dy[c[v]];
				if(b[x1][y1]=='#')
					break;
				if(v==t) {
					ans++;
				//	printf("%d %d\n",i,j);  //验证,用来判断起点是不是题目给出的正确起点
				}
			}
		}
	}
	printf("%d\n",ans);
	return 0;
}



3.题目:和美丽的列阵

输入:

5
3
2 1 3
3
69 69 69
5
100 54 80 43 90
4
3 4 3 3
2
2 1

输出:

2
0
57
1
1

直接最大值减去最小值就好了,跳过中间步骤,省时间。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
struct node {          //结构体的使用
	int x;
	int y;
} q[N];
int a[N],fa[N];
int n=1,m;
int main() {
	cin>>n;
	while(n--) {
		cin>>m;
		for(int i=1; i<=m; i++)
			cin>>a[i];
		sort(a+1,a+1+m);   //头文件的使用,快速排序
printf("%d\n",a[m]-a[1]);
	}
	return 0;
}

4.题目:萨沙和绘画

输入:

7
3 4
3 3
3 10
3 9
4 7
7 11
2 3

输出:

2
2
6
5
4
6
2

这规律真难找!!!

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long a[N],b[N],c[N];
int main() {
	int t;
	cin>>t;
	while(t--) {
		int n,m,k;
		cin>>n>>m;
		if(m<=4*n-4)
			printf("%d\n",(m+1)/2);
		else if(m==4*n-3)
			printf("%d\n",2*n-1);
		else
			printf("%d\n",2*n);
	}

	return 0;
}

5.题目:萨沙和赌场

输入:

9
2 1 7
2 1 1
2 3 15
3 3 6
4 4 5
5 4 7
4 88 1000000000
25 69 231
13 97 18806

输出:

YES
NO
YES
NO
NO
YES
NO
NO
NO

6.题目:只有两个中的一个

输入:

2 3 5

输出:

9

输入:

1 2 3

输入:

5

输入:

100000000 99999999 10000000000

输入:

500000002500000000

7.题目:村村通

输入:

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

输出:

1
0
2
998

说来惭愧,这题我居然卡了一个小时!

#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
struct node {          //结构体的使用
	int x;
	int y;
} q[N];
int s[N];
int n=1,m;
int find(int x) {
	while(s[x]>=0)//当指针不为-1时就会一直向前搜索,直到搜索出根结点
		x=s[x];
	return x;//返回根结点的下标
}
void bing(int root1,int root2) {
	if(root1==root2) {
		return ;
	} else {
		if(root1>root2){
		s[root2]+=s[root1];
			s[root1]=root2;}
		else{
		s[root1]+=s[root2];
			s[root2]=root1;}
	}
}
int main() {
	while(n) {                              //因为n是判断条件,但是又至少要输一次n,所以一开始令n=1,就可以开始执行我们的while循环了
		cin>>n;
		if(n==0)                          //等于0,直接结束,拜拜
			return 0;
		cin>>m;                           //节省时间,下面的步骤就不用进行了
		if(m==0)
		printf("%d\n",n-1);
		for(int i=1; i<=n; i++)          //我的博客有写的,而且有两种并和查,这种的题目就用s[i]=-1的好,还能计数
			s[i]=-1;
		for(int i=1; i<=m; i++) {
			cin>>q[i].x>>q[i].y;
		bing(find(q[i].x),find(q[i].y));  //并(注意看并的函数,有讲究的)
		}
		int ans=0;   
		for(int i=1; i<=n; i++) {
			if(s[i]<0)
				ans++;
			//	printf("%d ",s[i]);   //验证
		}
		printf("%d\n",ans-1);         //因为这里至少有一个根节点(就是说,如果都在一颗二叉树中,是不是有一个顶点啊,所以就多于了,要减去)
	}
	return 0;
}

8.题目:传送门

输入:

4 5
1 2 3
1 3 6
2 3 4
2 4 7
3 4 2

输出:

14

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值