补题ing

 1.字符串问题:

 数据库是结构化信息或数据(一般以电子形式存储在计算机系统中)的有组织的集合,通常由数据库管理系统 (DBMS) 来控制。在现实中,数据、DBMS 及关联应用一起被称为数据库系统,通常简称为数据库。

为了提高数据处理和查询效率,当今最常见的数据库通常以行和列的形式将数据存储在一系列的表中,支持用户便捷地访问、管理、修改、更新、控制和组织数据。另外,大多数数据库都使用结构化查询语言 (SQL) 来编写和查询数据。

接下来给你一个长度为 n 的字符串,对字符串进行  次查询,每次查询会输入一个操作数

1 x:删除字符串中所有ASCII码等于 x 的字符  2 p:添加一个ASCII码等于  的字符

3:按照字典序输出该字符串(操作3次数不超过100)

input:

第一行输入一个整数n,表示字符串S的长度

接下来输字符串 S(n <= 2e5)

第三行输入操作次数 q (q<=1000) 

接下来q行输入每种操作

output:题意即可;

分析:利用veotor迭代器,再STL函数像erase remove去解决问题;

注意remove并不是删除,因为它做不到删除:remove 不改变容器的大小 erase会改变;

remove 是将所有要移动的值 移动到 不移动的值之后;就相当于:一个相对有序的序列:

你需要把最高的两个线段移动到 其他所有线段之后;这时候用remove就可以达到理想的效果;

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

bool cmp(char  arr1,char arr2){
	return arr1 < arr2;
}

int main() {
	int n = 0;
	scanf("%d", &n);
	string tmp;
	getline(cin, tmp);
	vector<char>arr;
	for (int i = 0; i < n; i++) {
		char a;
		scanf("%c", &a);
		arr.push_back(a);
	}
	int q;
	scanf("%d", &q);
	while (q--) {
		int num = 0;
		scanf("%d", &num);
		if (num == 1) {
			int val = 0;
			scanf("%d", &val);
			arr.erase(remove(arr.begin(),arr.end(),val), arr.end());
			sort(arr.begin(), arr.end());
		}
		else if(num == 2){
			int val = 0;
			scanf("%d", &val);
			for (auto it = arr.begin(); it != arr.end(); it++) {
				if (*it >= val) {
					arr.insert(it, val);
					break;
				}
				if ((it+ 1) == arr.end()) {
					arr.insert(it+1, val);
					break;
				}
			}
			//arr.push_back(val);
			//sort(arr.begin(),arr.end());
		}
		else {
			for (auto it = arr.begin(); it != arr.end(); it++){
				printf("%c", *it);
			}
			printf("\n");
		}
	}
	return 0;
}

2.内存管理问题:

这一题官方的AC解法是 利用差分数组去记录 内存被变量占用的起始位置与终止位置;此外还用一个数组去判断内存是否可以被放值;

例如 : 当 sum[ index ] = sum[ index + size - 1 ] 是表示该位置能进行存放大小为 size 的变量;

此外上述式子成立的基本条件是要进行初始化(利用 del 差分数组 初始化 sum数组);

当del [ i ] == 1 时 sum[ i ] += sum[ i - 1 ] ; else: sum[ i ] = sum[ i - 1] ;  

为什么要这样初始化呢?

因为当del数组为:del [ 1   0   0   0   -1   0   0   0  ],它表示的是: 0 ~ 4 的下标内已经放入了变量;             sum [  1   1   1   1    1   1   1   1 ]    但是这样你会发现 哎 ? 这也不能表示出什么东西呀? 你如何去寻找下次存储变量的位置?  这时就要新引入一个 变量 occupy 来判断当前位置是否被占用(occupy 要配合差分数组进行判断 occupy += del[ i ]);当 occupy == 0 时 并且满足 sum[ index ] = sum[ index + size - 1 ] 时表示当前内存中的位置可以进行存储大小为 size 的新变量;

下面上代码:

#include<bits/stdc++.h>
#define MIN_MEM 1
#define MAX_MEM 10000
using namespace std;
const int N = 10010;
int sum[N], del[N];
map<string, pair<int, int>>mp;
int m, n;

// **初始化数组**
void rebuild() {
	sum[0] = del[0];
	for (int i = 0; i < m; i++) {
		if (del[i] == 1)
			sum[i] += sum[i - 1];
		else
			sum[i] = sum[i - 1];
	}
}
// **寻找合适的位置存放变量**
int find(int size) {
	rebuild();
	int occupy = 0;
	for(int i = 0; i < m; i++){
		occupy += del[i];
		if (occupy == 0 && sum[i + size - 1] == sum[i])
			return i;
	}
	return -1;
}

void isrt(int index, int size) {
	del[index] += 1;
	del[index + size] -= 1;
}


void remv(int index, int size) {
	del[index] -= 1;
	del[index + size] += 1;
}
int main() {
	int T = 0;
	scanf("%d", &T);
	while (T--) {
		//scanf("%d%d", &m, &n);
		cin >> m >> n;
		while (n--) {
			char flag;
			cin >> flag;
			if (flag == 'a') {
				string name;
				int size;
				cin >> name >> size;
				int index = find(size);
				printf("%d\n", index);
				if (index != -1) {
					mp[name].first = index;
					mp[name].second = size;
					isrt(mp[name].first,mp[name].second);
				}
			}
			else if(flag == 'd') {
				string name;
				cin >> name;
				remv(mp[name].first, mp[name].second);
				mp[name].first = 0; mp[name].second = 0;
			}
		}	
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值