数据结构day13

news/2024/7/5 8:18:01

昨天写了一天transformer代码,就写了一题简单模拟题,今天打了球,也没补上,花费1.5h左右;

题目详情 - 1042 Shuffling Machine (pintia.cn)

思路:用两个数组储存,start装着一开始的0-53编号,然后把start中的值赋给end的转换位置后的地方,最后用end覆盖start,继续循环。

          值得注意的是输出时数字和字符的下标需要清楚。 

#include<iostream>
using namespace std;

int main() {
	string ss = "SHCDJ";//  /13, 0-12:S
	int k;
	cin >> k;
	const int n = 54;
	int arr[n];
	for (int i = 0; i < n; i++) {
		cin >> arr[i];//记得-1取得下标
	}
	int start[n], end[n];
	for (int i = 0; i < n; i++) {//0-53,记得最后加1
		start[i] = i;
	}
	while (k--) {
		for (int i = 0; i < n; i++) {
			end[arr[i] - 1] = start[i];
		}
		for (int i = 0; i < n; i++) {
			start[i] = end[i];
		}
	}
	for (int i= 0; i < n; i++) {
		if (i != 0) {
			cout << ' ';
		}
		cout << ss[start[i] / 13] << start[i]%13 + 1;// /13和%13
	}
	return 0;
}

题目详情 - 1046 Shortest Distance (pintia.cn)

思路:空间换时间,一开始我写的是遍历left到right,取出值;但是容易发生运行超时,因为查询10^4,有10^5数据时,时间复杂度为10^9;所以需要用一个record数组储存每个点到第一个点的距离,不需要循环求值,复杂度就减少为10^4;

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

int main() {
	int n;
	scanf("%d", &n);
	int* dis = new int[n+2];//从1开始
	int* record = new int[n + 2];
	record[1] = 0;//第一个点到第一个点距离为0,以第一个点为基准,record[i]=i到1的距离
	int sum=0, min;
	for (int i = 0; i < n; i++) {
		scanf("%d", &dis[i + 1]);
		sum += dis[i + 1];
		record[i + 2] = sum;
	}
	int m;
	scanf("%d", &m);
	int left, right;
	while (m--) {
		scanf("%d %d", &left, &right);
		min = 0;
		if (left > right) {
			int temp = left;
			left = right;
			right = temp;
		}
		min = record[right] - record[left];
		printf("%d\n", (min < sum - min ? min : sum - min));
	}
	return 0;
}

题目详情 - 1065 A+B and C (64bit) (pintia.cn)

思路:我想的是用字符串输入,使用字符串相加后再比较;书上直接用正负溢出表示,属实聪明;

值得一提的是,用long double可以直接用a+b>c解决,我查的是long double可以表示20位10进制数字,那么尾数部分肯定大于64位,但是sizeof(long double)却是8,属实没搞懂,待进一步学习;

还有如果直接用a+b而不是res=a+b也会出错,待进一步研究,我觉得是编译器的问题;

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

int main() {
	int n;
	cin >> n;
	long long a, b, c;
	for (int i = 0; i < n; i++) {
		int flag = 1;
		scanf("%lld %lld %lld", &a, &b, &c);//%lld
		long long res = a + b;//不用res不行,why??
		if (a>0&&b>0&&res < 0) {//正溢出,a+b>2^63-1,c一定小于这个值
			flag = 1;
		}
		else if (a < 0 && b < 0 && res>=0) {
			flag = 0;//负溢出,两个负数相加大于等于0,c一定大于这个值
		}
		//其他情况不会溢出
		else if (res > c) {
			flag = 1;
		}
		else {
			flag = 0;
		}
		if (flag) {
			printf("Case #%d: true\n", i + 1);
		}
		else {
			printf("Case #%d: false\n", i + 1);
		}
	}
	return 0;
}

题目详情 - 1010 一元多项式求导 (pintia.cn)

思路:注意0 0;

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

int main() {
	int k, e;
	int flag = 0;
    //注意只有一项时打印0 0;否则不打印0 0
    //使用flag操作是否打印0 0以及多的空格
	while (scanf("%d %d", &k, &e) != EOF) {
		if (!e) {
			continue;
		}
		if (flag) {
			cout << ' ';
		}
		cout << k * e << ' ' << e - 1;
		flag = 1;
	}
	if (!flag) {
		cout << "0 0";
	}
	return 0;
}

题目详情 - 1002 A+B for Polynomials (pintia.cn)

思路:数据结构第一周有这题的复杂版,用链表完成;这一题更简单,因为n最大1000,用数组完成,输入a数组,把b数组加进去,即可;

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

int main() {
	double arr[1001] = { 0 };
	int n,m,e;
	double k;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> e >> k;
		arr[e] = k;
	}
	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> e >> k;
		arr[e] += k;
	}
	int ctn = 0;
	for (int i = 0; i < 1001; i++) {
		if (arr[i]!= 0) {
			++ctn;
		}
	}
	cout << ctn;
	for (int i = 1000; i >= 0; i--) {
		if (arr[i] != 0) {
			printf(" %d %.1f", i, arr[i]);
		}
	}
	return 0;
}

题目详情 - 1009 Product of Polynomials (pintia.cn)

思路:同多项式的乘法,简易版,用结构数组即可;

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

struct node {
	double k;
	int e;
};
int main() {
	node arr[1001]={0}, res[2001] = {0};
	int n, m;
	cin >> n;
	int e;
	double k;
	for (int i = 0; i < n; i++) {
		cin >> e >> k;
		arr[i].e = e;//储存第一个数组的指数
		arr[i].k = k;
	}
	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> e >> k;
		for (int j = 0; j < n; j++) {
			res[e + arr[j].e].k += arr[j].k * k;//结果数组用下标表示指数
		}
	}
	int ctn = 0;
	for (int i = 0; i < 2001; i++) {
		if (res[i].k != 0) {
			ctn++;
		}
	}
	cout << ctn;
	for (int i = 2000; i >=0; i--) {
		if (res[i].k != 0) {
			printf(" %d %.1f", i, res[i].k);
		}
	}
	return 0;
}

题目详情 - 1041 考试座位号 (pintia.cn)

思路:我先想的是用结构数组储存num,k,s,然后通过arr[i].s==s查找;这样时间复杂度较高,可以但没必要;直接通过s作为数组下标进行储存和查找更省事;值得再次写;

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

struct node {
	long long num;
	int k;//考试
};
int main() {
	node arr[1001];
	int n, k, s;
	long long num;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> num >> s >> k;
		arr[s].num = num;
		arr[s].k = k;
	}
	int m, t;
	cin >> m;
	while (m--) {
		cin >> t;
		cout << arr[t].num << ' ' << arr[t].k << endl;
	}
	return 0;
}

题目详情 - 1004 成绩排名 (pintia.cn)

 思路:太简单,看代码即可;

#include<iostream>
#include<vector>
#pragma warning(disable:4996)
using namespace std;

struct node {
	string name;
	string num;
	int score;
};
int main() {
	node max, min,temp;
	max.score = -1;
	min.score = 101;
	vector<node>v;
	int n;
	cin >> n;
	int score;
	string name, num;
	while (n--) {
		cin >> temp.name >> temp.num >> temp.score;
		v.push_back(temp);
		if (max.score < temp.score) {
			max.score = temp.score;
			max.name = temp.name;
			max.num = temp.num;
		}
		if (min.score > temp.score) {
			min.score = temp.score;
			min.name = temp.name;
			min.num = temp.num;
		}
	}
	cout << max.name << ' ' << max.num<<endl;
	cout << min.name << ' ' << min.num;
	return 0;
}

题目详情 - 1028 人口普查 (pintia.cn) 

思路:用20140906与20130906整数进行比较会更便捷,这也是我上实践课写财务系统时候突然想到的,在这道简单题用上了,比答案简单不少;

#include<iostream>
#include<vector>
#pragma warning(disable:4996)
using namespace std;

int main() {
	int n;
	cin >> n;
	string name, max_name, min_name;
	int time,yr, month, dy;//<18140906,>20140906不符
	int max_time = 18140905, min_time = 20140907;
	int ctn = 0;
	while (n--) {
		cin >> name;
		scanf("%d/%d/%d", &yr, &month, &dy);
		time = yr * 10000 + month * 100 + dy;
		if (time > 20140906 || time < 18140906) {
			continue;
		}
		++ctn;
		if (max_time < time) {//max_time对应年纪最小
			max_time = time;
			min_name = name;
		}
		if (min_time > time) {
			min_time = time;
			max_name = name;
		}
	}
    if(!ctn){//对应测试点4;
        cout<<0;
    }else{
        cout << ctn << ' ' << max_name << ' ' << min_name;
    }
	return 0;
}

 


http://lihuaxi.xjx100.cn/news/31183.html

相关文章

Web前端:如何评估前端开发人员

前端开发人员在弥合任何web或应用程序开发项目的技术和非技术方面的差距方面发挥着关键作用。它们建立在后端开发人员的工作基础上&#xff0c;创建我们在网站和应用程序上与之交互的面向用户的内容。 鉴于他们角色的双重性&#xff0c;他们的工作需要在功能和形式之间取得平衡…

Android 实现seekBar仿抖音拖动后改变thumb kotlin实现

Android 实现seekBar仿抖音拖动后改变thumb kotlin实现 又是一个没被甲方采用的方案哈哈哈 抖音的进度条默认状态下是半透明的灰色&#xff0c;thumb是一个同样的灰色的圆 点击、拖动后&#xff0c;progress变为白色&#xff0c;高度变高&#xff0c;thumb变为圆角矩形&#xf…

微服务 Spring Boot 整合Redis分布式锁 实现优惠卷秒杀 一人一单

文章目录⛅前言一、集群环境下 秒杀 一人一单的并发问题二、什么是分布式锁&#xff1f;⛄基本原理和实现方式⚡Redis 分布式锁的核心实现思路三、实战开发 实现 Redis 分布式锁四、ApiFox 测试 集群模式下是否能够解决并发问题⛵小结⛅前言 在微服务 Spring Boot 整合Redis 实…

基于java高校新生报道及宿舍分配平台计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

基于java高校新生报道及宿舍分配平台计算机毕业设计源码系统lw文档mysql数据库调试部署 基于java高校新生报道及宿舍分配平台计算机毕业设计源码系统lw文档mysql数据库调试部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件…

Vmware16环境下NAT模式下CentOS7最小安装版, 设置静态IP 配置静态IP 固定IP

Vmware16环境下NAT模式下CentOS7最小安装版 设置固定静态IP 查看网关地址 默认网关可能不是1 , 比如可能是192.168.1.2 查看 VMware16的 NAT网络的 网关地址 点击打开菜单栏编辑按钮的下拉菜单 选虚拟网络编辑器 在弹出的窗口选 NAT模式的行, 使其变成蓝色 再点击 NAT设置…

15天深度复习JavaWeb的详细笔记(十二)——综合案例

文章目录demo12-综合案例1&#xff0c;功能介绍2&#xff0c;环境准备2.1 工程准备2.2 创建表3&#xff0c;查询所有功能3.1 后端实现3.1.1 dao方法实现3.1.2 service方法实现3.1.3 servlet实现3.1.4 测试后端程序3.2 前端实现4&#xff0c;添加功能4.1 后端实现4.1.1 dao方法实…

kubernetes -- Pod健康检查

目录 一、Pod探针基本概念 1、Pod状态 2、更准确的判断Pod状态 3、容器探针 4、检测结果 ​编辑 二、使用存活探针 1、存活探针案例 2、Liveness探针流程 3、查看存活探针信息 4、探针高级配置 5、探针高级配置 6、存活探针 - HTTP 7、存活探针 - TCP 三、使用就…

【vue设计与实现】双端Diff算法 2-非理想状况的处理方式

在前面&#xff0c;用的都是比较理想的例子。双端Diff算法的每一轮比较的过程都分为四个步骤。理想的情况是&#xff0c;每一轮比较都会命中四个步骤中的一个&#xff0c;但实际上&#xff0c;并不是所有情况都这么理想&#xff0c;例如下面这个例子 旧的一组子节点&#xff1…