数据结构day34

总结:扩展欧几里得算法跳过了,看不懂;5.8也跳过了,感觉学了无用处;其次,需要加深对cin和cout的理解,以及一些计算机基础知识。

题目详情 - 1024 Palindromic Number (pintia.cn)

思路:用vector代替结构体,高精度加法加判断回文即可;

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

bool is_p(vectorv) {
	for (int i = 0; i < v.size()/2; i++) {
		if (v[i] != v[v.size() - 1 - i]) {
			return false;
		}
	}
	return true;
}
void add(vector& v) {
	int carry = 0;
	int t;
	vectortemp = v;
	reverse(v.begin(), v.end());//原本下标0是高位
	for (int i = 0; i < v.size(); i++) {
		t = v[i] + temp[i] + carry;
		v[i] = t % 10;
		carry = t / 10;
	}
	if (carry) {
		v.push_back(carry % 10);
		carry /= 10;
	}
	reverse(v.begin(), v.end());
}
int main() {
	vectorv;
	string n;
	int k;
	cin >> n >> k;
	for (int i = 0; i < n.size(); i++) {
		v.push_back(n[i] - '0');
	}
	int ctn = 0;
	do {
		if (is_p(v)) {
			for (int i = 0; i < v.size(); i++) {
				cout << v[i];
			}
			cout << endl << ctn;
			return 0;
		}
		else
		{
			add(v);
			ctn++;

		}
	} while (--k);
	for (int i = 0; i < v.size(); i++) {
		cout << v[i];
	}
	cout << endl << ctn;
	return 0;
}

题目详情 - 1039 Course List for Student (pintia.cn)

思路:主要是hashtable的应用,算法笔记121页,将字符串26进制转换为整数10进制即可;

 

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

int getIndex(string str) {
	//26*26*26*10
	int index = 0;
	for (int i = 0; i < 3; i++) {
		index = (str[i]-'A') +index* 26;//注意是=,不是+=
	}
	index = (str[3]-'0') +index* 10;
	return index;
}
vectorv[26 * 26 * 26 * 10+1];
int main() {
	//vector+hash
	int n, k;
	cin >> n >> k;
	int id, ctn;
	string str;
	for (int i = 0; i < k; i++) {;
		cin >> id >> ctn;
		while (ctn--) {
			cin >> str;
			int index = getIndex(str);
			v[index].push_back(id);//v[index].size()得长度
		}
	}
	for (int i = 0; i < n; i++) {
		cin >> str;
		cout << str << ' ';
		int index = getIndex(str);
		cout << v[index].size();
		sort(v[index].begin(), v[index].end());
		for (int i = 0; i < v[index].size(); i++) {
			cout << ' ' << v[index][i];
		}
		cout << endl;
	}
	return 0;
}

题目详情 - 1047 Student List for Course (pintia.cn) 

思路: 和上题几乎一致;需要注意的是用string测试点3会超时,所以先用char[]读取,再赋给string;输出时用string.c_str()输出即可;

值得一提的是,用cin,cout加速也不行,还是需要用char[]

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

表示不理解,然后继续查找,发现把endl更改为'\n'后成功,甚至没有加速cin和cout

scanf和printf

 cin和cout

 继续不理解,CSDN一会后了解到,一些计算机基础知识没有掌握,以后学习;

(156条消息) std::endl与'\n'的区别(c++基础)_CNG Steve·Curcy的博客-CSDN博客_std::endl

需要了解缓冲区,流等的概念;

回到问题:主要原因是endl频繁刷新缓冲区,用了很多时间造成的;

 

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

vectorv[2501];
int main() {
	int n, k;
	cin >> n >> k;
	char ch[5];
	string str;
	int size, id;
	for (int i = 0; i < n; i++) {
		scanf("%s %d", ch, &size);
		//cin >> str >> size;
		str =ch;
		while (size--) {
			cin >> id;
			v[id].push_back(str);
		}
	}
	for (int i = 1; i <= k; i++) {
		cout << i << ' ' << v[i].size()<

 

 

你可能感兴趣的:(数据结构,数据结构,c++,算法)