CCF刷题(持续更新)

518 阅读20分钟

201903-1.小中大

笔记:先假设mid为float型,通过mid-(int)mid判断其是否是整数,若是则通过强制类型转换为int型。

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, max, min;
	float mid;
	scanf("%d", &n);
	vector<int> v(n);
	for (int i = 0; i < n; i++)
		scanf("%d", &v[i]);
	if (n % 2 == 0)
		mid = (v[n / 2 - 1] + v[n / 2]) / 2.0;
	else
		mid = v[n / 2];
	max = v[0] >= v[n - 1] ? v[0] : v[n - 1];
	min = v[0] <= v[n - 1] ? v[0] : v[n - 1];
	if (mid - (int)mid == 0)
		cout << max << " " << (int)mid << " " << min;
	else
		cout << max << " " << mid << " " << min;
	return 0;
}

201903-2.二十四点

笔记:使用scanf()时注意&;

getline(cin,str)//读取一行string类型

gets(str)//读取一行,char[]类型

cin>>str//碰到空格即结束读取

更具体的参考 blog.csdn.net/qq_40679299…

#include <iostream>
#include <stack>
using namespace std;

int main() {
	int n;
	char str[7];
	stack<int> num;
	stack<char> sign;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		cin >> str;
		while (!num.empty())num.pop();
		while (!sign.empty())sign.pop();
		for (int j = 0; j < 7; j++) {
			if (str[j] >= '0'&&str[j] <= '9') {
				num.push(str[j] - '0');
			}
			else if (str[j] == '+') {
				sign.push('+');
			}
			else if (str[j] == '-') {
				sign.push('+');
				num.push((-1)*(str[j + 1] - '0'));
				j++;
			}
			else if (str[j] == 'x') {
				int ans = num.top();
				num.pop();
				num.push(ans*(str[j + 1] - '0'));
				j++;
			}
			else {
				int ans = num.top();
				num.pop();
				num.push(ans / (str[j + 1] - '0'));
				j++;
			}
		}
		while (!sign.empty()) {
			int ans_1 = num.top();
			num.pop();
			int ans_2 = num.top();
			num.pop();
			num.push(ans_1 + ans_2);
			sign.pop();
		}
		if (num.top() == 24)
			cout << "Yes\n";
		else
			cout << "No\n";
	}
	return 0;
}

201903-3.损坏的RAID5

201903-4.消息传递接口

我的代码测试示例没问题,但是只得了20分,好像是超时的原因?先贴上我的代码供日后纠错,再贴上大佬正确的代码,学习自:blog.csdn.net/richenyunqi…

我的代码:

#include <iostream>
#include <queue>
using namespace std;

int main() {
	int T, n;
	scanf("%d%d%*c", &T, &n);
	vector<queue<int>> process(n);
	while (T--) {
		string str;
		queue<int> empty;
		for (int i = 0; i < n; i++) {
			swap(empty, process[i]);
			getline(cin, str);
			for (int j = 0, k; j < str.size(); j = k + 1) {
				k = str.find(' ', j);
				if (k == string::npos)
					k = str.size();
				if (str[j] == 'S')
					process[i].push(stoi(str.substr(j + 1, k - j - 1)) + i * 10000);
				else
					process[i].push(-(stoi(str.substr(j + 1, k - j - 1)) * 10000 + i));
			}
		}
		bool flag = true;
		while (flag) {
			flag = false;
			for (int i = 0; i < n; i++) {
				if (process[i].empty())
					continue;
				for (int j = 0; j < n; j++) {
					if (process[j].empty())
						continue;
					if (process[i].front() == -process[j].front()) {
						process[i].pop();
						process[j].pop();
						flag = true;
					}
				}
			}
		}
		for (int i = 0; i < n; i++)
			if (!process[i].empty())
				flag = true;
		flag ? cout << 1 << endl : cout << 0 << endl;
	}
	return 0;
}

大佬的代码:

#include <iostream>
#include <queue>
#include <list>
#include <unordered_set>
using namespace std;
int main() {
	int T, n;
	scanf("%d%d%*c", &T, &n);
	while (T--) {
		list<pair<queue<int>, int>>process;//first成员是一个队列,存储每个进程的所有指令;second成员存储上一条执行的指令,初始化为INT_MAX
		unordered_set<int>commands;//存储每个进程正在执行的指令
		string s;
		for (int i = 0; i < n; ++i) {
			process.push_back({ queue<int>(),INT_MAX });
			getline(cin, s);
			for (int j = 0, k; j < s.size(); j = k + 1) {//按空格键分割字符串,并用整数表示指令
				k = s.find(' ', j);
				if (k == string::npos)
					k = s.size();
				if (s[j] == 'S')
					process.back().first.push(i * 10000 + stoi(s.substr(j + 1, k - j - 1)));
				else
					process.back().first.push(-(stoi(s.substr(j + 1, k - j - 1)) * 10000 + i));
			}
		}
		for (bool f = true; !process.empty(); f = true) {//f标志是否所有进程指令都被堵塞
			for (auto i = process.begin(); i != process.end(); ++i) {//遍历所有进程
				if (commands.find(i->second) != commands.end())//上一次执行的指令被堵塞了
					continue;//进程也被堵塞,其他指令无法执行
				if ((i->first).empty()) {//所有指令均已执行完毕
					i = process.erase(i);//将该进程删除
					--i;
					continue;
				}
				while (!(i->first).empty()) {//进程还有指令要执行
					int t = (i->first).front();//从队首弹出一条指令
					(i->first).pop();
					auto j = commands.find(-t);//查找其它进程中是否有正在执行的对应的指令
					if (j == commands.end()) {//没有对应的指令
						commands.insert(t);//将该指令插入到commands中
						i->second = t;//更新上一次执行的指令为当前指令
						break;
					}
					else {//有对应的指令
						commands.erase(j);//将对应的指令从commands中删除
						f = false;//并不是所有进程都被堵塞
					}
				}
			}
			if (f)//遍历完所有进程后发现所有进程均被堵塞,说明发生死锁
				break;
		}
		puts(process.empty() ? "0" : "1");//跳出循环时进程list为空,表示所有进程指令均执行完毕,则没有死锁
	}
	return 0;
}

201812-1.小明上学

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int r, y, g;//红灯,黄灯,绿灯
	int n;//路口和道路数
	int sum = 0;
	scanf("%d%d%d%d", &r, &y, &g, &n);
	vector<int> k(n), t(n);
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &k[i], &t[i]);
		switch (k[i]) {
		case 0:
		case 1:
			sum += t[i];
			break;
		case 2:
			sum += (t[i] + r);
			break;
		}
	}
	printf("%d", sum);
	return 0;
}

201812-2.小明放学

笔记:题目给出的测试用例可能很大,需要long long型。

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int r, y, g, tm;//红灯,黄灯,绿灯
	int n;//路口和道路数
	long long sum = 0;
	scanf("%d%d%d%d", &r, &y, &g, &n);
	vector<long long> k(n), t(n);
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &k[i], &t[i]);
		tm = sum % (r + y + g);
		switch (k[i]) {
		case 0:
			sum += t[i];
			break;
		case 1:
			if (t[i] > tm) {//红灯 
				t[i] -= tm;
				sum += t[i];
			}
			else if (tm >= t[i] + g && tm <= t[i] + g + y) {//黄灯 
				t[i] = y + g + t[i] - tm;
				sum += (t[i] + r);
			}
			else if (tm > t[i] + g + y) {//红灯 
				t[i] = t[i] + r + g + y - tm;
				sum += t[i];
			}
			break;
		case 2:
			if (t[i] > tm) {//黄灯 
				t[i] -= tm;
				sum += (t[i] + r);
			}
			else if (tm >= t[i] && tm < t[i] + r) {//红灯 
				t[i] = r + t[i] - tm;
				sum += t[i];
			}
			else if (tm > t[i] + r + g) {//黄灯 
				t[i] = r + y + g + t[i] - tm;
				sum += (t[i] + r);
			}
			break;
		case 3:
			if (tm >= t[i] && tm < t[i] + y) {//黄灯 
				t[i] = y + t[i] - tm;
				sum += (t[i] + r);
			}
			else if (tm >= t[i] + y && tm < t[i] + y + r) {//红灯 
				t[i] = t[i] + y + r - tm;
				sum += t[i];
			}
		}
	}
	printf("%lld", sum);
	return 0;
}

201812-4.数据中心

#include <iostream>
#include <algorithm> 
using namespace std;
const int MAXV = 50005;
const int MAXE = 100005;
struct edge {
	int u, v;
	int cost;
}E[MAXE];
bool cmp(edge a, edge b) {
	return a.cost < b.cost;
}
int father[MAXV];//并查集数组 
int findFather(int x) {//并查集查询函数 
	int a = x;
	while (x != father[x]) {
		x = father[x];
	}
	//路径压缩
	while (a != father[a]) {
		int z = a;
		a = father[a];
		father[z] = x;
	}
	return x;
}
//kruskal 部分,返回最小生成树最长边,参数n为顶点个数,m为图的边数 
int kruskal(int n, int m) {
	//ans为所求解,Num_Edge为当前生成树的边数
	int ans = 0, Num_Edge = 0;
	for (int i = 1; i <= n; i++) {//顶点范围是[1,n] 
		father[i] = i;//并查集初始化 
	}
	sort(E, E + m, cmp);//所有边按边权从小到大排序
	for (int i = 0; i < m; i++) {//枚举所有边 
		int faU = findFather(E[i].u);//查询测试边两个端点所在集合的根结点
		int faV = findFather(E[i].v);
		if (faU != faV) {//如果不在一个集合中
			father[faU] = faV;//合并集合(即把测试边加入最小生成树中) 
			ans = E[i].cost;//测试边为当前所求解
			Num_Edge++;//当前生成树的边数加1
			if (Num_Edge == n - 1)break;//边数等于顶点数减1时结束算法 
		}
	}
	if (Num_Edge != n - 1)return -1;//无法连通时返回-1
	else return ans;
}
int main() {
	int n, m, root;
	scanf("%d%d%d", &n, &m, &root);
	for (int i = 0; i < m; i++) {
		scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].cost);//两个端点编号、边权 
	}
	int ans = kruskal(n, m);//kruskal算法入口 
	printf("%d", ans);
	return 0;
}

201809-1.卖菜

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> v(n), v2(n);
	for (int i = 0; i < n; i++)
		cin >> v[i];
	for (int i = 0; i < n; i++) {
		if (i == 0)
			v2[0] = (v[0] + v[1]) / 2;
		else if (i == n - 1)
			v2[n - 1] = (v[n - 2] + v[n - 1]) / 2;
		else
			v2[i] = (v[i - 1] + v[i] + v[i + 1]) / 3;
	}
	for (int i : v2)
		cout << i << " ";
	return 0;
}

201809-2.买菜

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, ans = 0;
	cin >> n;
	vector<pair<int, int>> h(n), w(n);
	for (int i = 0; i < n; i++)
		cin >> h[i].first >> h[i].second;
	for (int i = 0; i < n; i++)
		cin >> w[i].first >> w[i].second;
	for (pair<int, int> p1 : h)
		for (pair<int, int> p2 : w)
			if (p1.first <= p2.second&&p1.second >= p2.first)
				ans += min(p1.second, p2.second) - max(p1.first, p2.first);
	cout << ans;
	return 0;
}

201803-1.跳一跳

#include <iostream>
using namespace std;

int main() {
	int pre = -1, ans, sum = 0, sorce;
	while (cin >> ans) {
		if (ans == 0)
			cout << sum;
		else if (ans == 1) {
			sorce = 1;
			sum += sorce;
		}
		else if (ans == 2) {
			if (pre == -1 || sorce == 1) {
				sorce = 2;
				sum += sorce;
			}
			else {
				sorce += 2;
				sum += sorce;
			}
		}
		pre = sorce;
	}
	return 0;
}

201803-2.碰撞的小球

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, L, t;
	cin >> n >> L >> t;
	vector<pair<int, int>> ball(n + 1);//表示小球的位置和小球的方向的组合,其中1表示向右,-1表示向左
	vector<int> loc(L + 1, 0);//记录坐标轴上各位置有无小球,0表示不存在小球,否则表示小球编号 
	for (int i = 1; i <= n; i++) {
		cin >> ball[i].first;
		ball[i].second = 1;
		loc[ball[i].first] = i;
	}
	while (t--) {
		for (int i = 1; i <= n; i++) {
			loc[ball[i].first] = 0;//小球从当前位置移走 
			ball[i].first += ball[i].second;//小球到达目标位置 
			if (loc[ball[i].first] != 0) {//目标位置已存在小球,发生碰撞 
				ball[i].second *= -1;
				ball[loc[ball[i].first]].second *= -1;
			}
			else if (ball[i].first == 0 || ball[i].first == L)//小球碰到墙壁修改方向 
				ball[i].second *= -1;
			loc[ball[i].first] = i;//更新小球在坐标轴上的位置 
		}
	}
	for (int i = 1; i <= n; i++)
		cout << ball[i].first << " ";
	return 0;
}

201712-1.最小差值

笔记:利用里的sort()可以进行快速排序。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
		cin >> v[i];
	sort(v.begin(), v.end());
	int ans = v[1] - v[0];
	for (int i = 1; i < n - 1; i++)
		if (v[i + 1] - v[i] < ans)
			ans = v[i + 1] - v[i];
	cout << ans;
	return 0;
}

201712-2.游戏

#include <iostream>
#include <queue>
using namespace std;

int main() {
	int n, k, curr = 1, child;//curr表示当前报哪位数,child表示小朋友编号 
	cin >> n >> k;
	queue<int> q;
	for (int i = 1; i <= n; i++)
		q.push(i);
	while (q.size() > 1) {
		child = q.front();
		q.pop();
		if (curr%k != 0 && curr % 10 != k)
			q.push(child);
		curr++;
	}
	cout << q.front();
	return 0;
}

201709-1.打酱油

笔记:注意2*n/5和(n/5)*2逻辑上的问题.

#include <iostream>
using namespace std;

int main() {
	int N;
	cin >> N;
 	int n = N / 10;//n表示不算赠送的瓶数 
	int ans_5 = (n / 5) * 2;//表示买五瓶赠送的瓶数
	int res = n % 5;
	int ans_3 = res / 3;//表示买三瓶赠送的瓶数
	cout << n + ans_5 + ans_3;
	return 0;
}

201709-2.公共钥匙盒

笔记:利用优先级队列(priority_queue),重载其<运算符使其符合题目要求。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct Key {
	int num;//钥匙编号 
	int time;//当前时间 
	bool borrow;//true表示借钥匙,false表示取钥匙
	Key(int n, int t, bool b) :num(n), time(t), borrow(b) {}
	bool operator < (const Key&k)const {
		if (this->time != k.time)
			return this->time > k.time;
		else if (this->borrow != k.borrow)
			return this->borrow && !k.borrow;
		else
			return this->num > k.num;
	}
};
priority_queue<Key> pq;
int main() {
	int N, K;
	cin >> N >> K;
	vector<int> key(N + 1);
	for (int i = 1; i <= N; i++)
		key[i] = i;
	for (int i = 0; i < K; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		pq.push(Key(a, b, true));
		pq.push(Key(a, b + c, false));
	}
	while (!pq.empty()) {
		Key j = pq.top();
		pq.pop();
		if (j.borrow) {
			int i = 1;
			while (key[i] != j.num)
				i++;
			key[i] = -1;
		}
		else if (!j.borrow) {
			int i = 1;
			while (key[i] != -1)
				i++;
			key[i] = j.num;
		}
	}
	for (int i = 1; i <= N; i++)
		cout << key[i] << " ";
	return 0;
}

201709-4.通信网络

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> Adj[1005];//图G的邻接表
int N, M;//n为顶点数
bool vis[1005];//如果顶点i已被访问,则vis[i]==true。初值为false
bool konw[1005][1005];
void DFS(int u, int start) {
	vis[u] = true;
	konw[u][start] = konw[start][u] = true;
	for (int i = 0; i < Adj[u].size(); i++)
		if (!vis[Adj[u][i]])
			DFS(Adj[u][i], start);
}
int main() {
	scanf("%d%d", &N, &M);
	while (M--) {
		int a, b;
		scanf("%d%d", &a, &b);
		Adj[a].push_back(b);
	}
	int ans = 0;
	for (int i = 1; i <= N; i++) {
		fill(vis + 1, vis + N + 1, false);
		DFS(i, i);
	}
	for (int i = 1; i <= N; i++)
		if (count(konw[i] + 1, konw[i] + N + 1, true) == N)
			ans++;
	printf("%d", ans);
	return 0;
}

201703-1.分蛋糕

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, k, ans = 0, weight = 0;
	cin >> n >> k;
	vector<int> cake(n);
	for (int i = 0; i < n; i++)
		cin >> cake[i];
	for (int i = 0; i < n; i++) {
		weight += cake[i];
		if (weight >= k) {
			ans++;
			weight = 0;
		}
	}
	if (weight > 0)
		cout << ans + 1;
	else 
		cout << ans;
	return 0;
}

201703-2.学生排队

笔记:注意使用erase()后,原it也将消亡,但它会返回下一个元素的迭代器。

#include <iostream>
#include <list>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	list<int> lst;
	for (int i = 1; i <= n; i++)
		lst.push_back(i);
	while (m--) {
		int stu, dist;
		cin >> stu >> dist;
		auto it = lst.begin();
		while (*it != stu)
			it++;
		it = lst.erase(it);
		while (dist > 0) {
			it++;
			dist--;
		}
		while (dist < 0) {
			it--;
			dist++;
		}
		lst.insert(it, stu);
	}
	for (int i : lst)
		cout << i << " ";
	return 0;
}

201612-1.中间数

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> num(n);
	for (int i = 0; i < n; i++)
		cin >> num[i];
	sort(num.begin(), num.end());
	int ans = num[n / 2];
	int left = 0, right = 0;
	for (int i = 0; i < n; i++) {
		if (num[i] < ans)
			left++;
		else if (num[i] > ans)
			right++;
	}
	if (left == right)
		cout << ans;
	else
		cout << -1;
	return 0;
}

201612-2.工资计算


201609-1.最大波动

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, ans = 0;
	cin >> n;
	vector<int> stock(n);
	cin >> stock[0];
	for (int i = 1; i < n; i++) {
		cin >> stock[i];
		if (abs(stock[i] - stock[i - 1]) > ans)
			ans = abs(stock[i] - stock[i - 1]);
	}
	cout << ans;
	return 0;
}

201609-2.火车购票

#include <iostream>
using namespace std;

int main() {
	int seat[20];
	for (int i = 0; i < 20; i++)
		seat[i] = 5;
	int n, ans;
	cin >> n;
	while (n--) {
		cin >> ans;
		bool flag = true;
		for (int i = 0; i < 20; i++) {
			if (seat[i] >= ans) {
				flag = false;
				int j = i * 5 + 6 - seat[i];
				seat[i] -= ans;
				while (ans--) {
					cout << j << " ";
					j++;
				}
				break;
			}
		}
		if (flag) {
			while (ans) {
				for (int i = 0; i < 20; i++) {
					if (seat[i] != 0) {
						cout << i * 5 + 6 - seat[i] << " ";
						ans--;
						seat[i]--;
					}
				}
			}
		}
		cout << endl;
	}
	return 0;
}

201604-1.折点计数

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n, ans = 0;
	cin >> n;
	vector<int> sales(n);
	for (int i = 0; i < n; i++)
		cin >> sales[i];
	for (int i = 1; i < n - 1; i++)
		if ((sales[i] > sales[i - 1] && sales[i] > sales[i + 1])
			|| (sales[i] < sales[i - 1] && sales[i] < sales[i + 1]))
			ans++;
	cout << ans;
	return 0;
}

201604-2.俄罗斯方块


201512-1.数位之和

#include <iostream>
#include <string>
using namespace std;

int main() {
	string str;
	cin >> str;
	int ans = 0;
	for (int i = 0; i < str.size(); i++)
		ans += str[i] - '0';
	cout << ans;
	return 0;
}

201512-2.消除类游戏

笔记:利用pair记录待消除点的坐标。

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int row, col;//行列 
	cin >> row >> col;
	vector<vector<int>> v(row);
	for (int i = 0; i < row; i++) {
		v[i].resize(col);
		for (int j = 0; j < col; j++)
			cin >> v[i][j];
	}
	vector<pair<int, int>> remove_dot;//记录待消除点的坐标,最后一把消除 
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col - 2; j++) {
			if (v[i][j] == v[i][j + 1] && v[i][j] == v[i][j + 2]) {
				remove_dot.push_back(make_pair(i, j));
				remove_dot.push_back(make_pair(i, j + 1));
				remove_dot.push_back(make_pair(i, j + 2));
			}
		}
	}
	for (int j = 0; j < col; j++) {
		for (int i = 0; i < row - 2; i++) {
			if (v[i][j] == v[i + 1][j] && v[i][j] == v[i + 2][j]) {
				remove_dot.push_back(make_pair(i, j));
				remove_dot.push_back(make_pair(i + 1, j));
				remove_dot.push_back(make_pair(i + 2, j));
			}
		}
	}
	for (auto i : remove_dot)
		v[i.first][i.second] = 0;
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			cout << v[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

201509-1.数列分段

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n,ans=1;
	cin>>n;
	vector<int> v(n);
	for(int i=0;i<n;i++)
		cin>>v[i];
	for(int i=1;i<n;i++)
		if(v[i]!=v[i-1])
			ans++;
	cout<<ans;
	return 0;
}

201509-2.日期计算

笔记:别大意,二月的下标为1。

#include <iostream>
using namespace std;

int main() {
	int y, d;
	cin >> y >> d;
	int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
		month[1] = 29;
	int i = 0;
	while (d > month[i++])
		d -= month[i - 1];
	cout << i << endl << d;
	return 0;
}

201503-1.图像旋转

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int row, col;
	cin >> row >> col;
	vector<vector<int>> matrix(row);
	for (int i = 0; i < row; i++) {
		matrix[i].resize(col);
		for (int j = 0; j < col; j++)
			cin >> matrix[i][j];
	}
	for (int j = col - 1; j >= 0; j--) {
		for (int i = 0; i < row; i++)
			cout << matrix[i][j] << " ";
		cout << endl;
	}
	return 0;
}

201503-2.数字排序

笔记:需要对map的值进行排序时可以将其转化为vector,重定义cmp函数使其符合自己的要求。

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

bool cmp(pair<int, int> a, pair<int, int> b) {
	if (a.second != b.second)
		return a.second > b.second;
	else
		return a.first < b.first;
}
int main() {
	int n, ans;
	cin >> n;
	map<int, int> m;
	for (int i = 0; i < n; i++) {
		cin >> ans;
		if (m.count(ans))
			m[ans]++;
		else
			m[ans] = 1;
	}
	vector<pair<int, int>> v(m.size());
	int i = 0;
	for (auto it = m.begin(); it != m.end(); it++, i++)
		v[i] = make_pair(it->first, it->second);
	sort(v.begin(), v.end(), cmp);
	for (auto i : v)
		cout << i.first << " " << i.second << endl;
	return 0;
}

201412-1.门禁系统

#include <iostream>
#include <map>
using namespace std;

int main() {
	int n, k;
	cin >> n;
	map<int, int> m;
	for (int i = 0; i < n; i++) {
		cin >> k;
		if (m.count(k))
			m[k]++;
		else
			m[k] = 1;
		cout << m[k] << " ";
	}
	return 0;
}

201412-2.Z字门扫描


201409-1.相邻数对

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
	int n, ans = 0;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
		cin >> v[i];
	sort(v.begin(), v.end());
	for (int i = 0; i < n - 1; i++)
		if (v[i + 1] - v[i] == 1)
			ans++;
	cout << ans;
	return 0;
}

201409-2.画图

#include <iostream>
#include <set>
using namespace std;

int main() {
	int n, x1, x2, y1, y2;
	cin >> n;
	set<pair<int, int>> coord;
	for (int i = 0; i < n; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		for (int j = x1; j < x2; j++)
			for (int k = y1; k < y2; k++)
				coord.insert(make_pair(j, k));
	}
	cout << coord.size();
	return 0;
}

201409-3.字符串匹配

笔记:关于正则表达式可以参考:blog.csdn.net/qq_34802416…

#include <iostream>
#include <regex>
using namespace std;

int main() {
	int j, n;
	string s, str;
	cin >> s;
	scanf("%d%d%*c", &j, &n);
	regex r("[[:alpha:]]*" + s + "[[:alpha:]]*");
	if (j == 0)//大小写不敏感 
		r = regex("[[:alpha:]]*" + s + "[[:alpha:]]*", regex::icase);
	while (n--) {
		cin >> str;
		if (regex_match(str, r))
			cout << str << endl;
	}
	return 0;
}

201409-4.最优配餐


201403-1.相反数

#include <iostream>
#include <set>
using namespace std;

int main() {
	int n, num, ans = 0;
	cin >> n;
	set<int> s;
	for (int i = 0; i < n; i++) {
		cin >> num;
		if (s.count(-num))
			ans++;
		else
			s.insert(num);
	}
	cout << ans;
	return 0;
}

201403-2.窗口

笔记:学会定义类,可以方便问题解答。

#include <iostream>
#include <list>
using namespace std;

struct Window {
	int num;//编号 
	int x1, x2, y1, y2;//坐标 
};
int main() {
	int N, M;
	cin >> N >> M;
	list<Window> l;
	for (int i = 1; i <= N; i++) {
		Window w;
		w.num = i;
		cin >> w.x1 >> w.y1 >> w.x2 >> w.y2;
		l.push_front(w);
	}
	int a, b;
	while (M--) {
		cin >> a >> b;
		bool flag = true;
		for (auto it = l.begin(); it != l.end(); it++) {
			if (it->x1 <= a && it->x2 >= a && it->y1 <= b && it->y2 >= b) {
				cout << it->num << endl;
				l.push_front(*it);
				l.erase(it);
				flag = false;
				break;
			}
		}
		if (flag)
			cout << "IGNORED" << endl;
	}
	return 0;
}

201403-3.命令行选项

笔记:小心=和==,粗心就会浪费很多时间。

#include <iostream>
#include <map>
#include <sstream>
using namespace std;

int main() {
	int type[128] = { 0 };
	string s, t;
	cin >> s;
	for (int i = 0; i < s.size(); ++i) {
		if (s[i + 1] == ':')
			type[s[i++]] = 2;
		else
			type[s[i]] = 1;
	}
	int n;
	scanf("%d%*c", &n);
	for (int i = 1; i <= n; i++) {
		getline(cin, s);
		stringstream ss(s);
		map<char, string> m;
		ss >> s;
		while (ss >> s) {
			if (s.size() == 2 && s[0] == '-'&&type[s[1]] == 1)
				m[s[1]] = "";
			else if (s.size() == 2 && s[0] == '-'&&type[s[1]] == 2 && ss >> t)
				m[s[1]] = t;
			else
				break;
		}
		cout << "Case " << i << ":";
		for (auto it = m.begin(); it != m.end(); it++)
			cout << " -" << it->first << " " << it->second;
		cout << endl;
	}
	return 0;
}

201403-4.无线网络

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct Router {
	long long x, y;//坐标
	int cost = 0, addNum = 0;//经过的路由器数量,增设的路由器数量
	bool addRouter;//是否是增设的路由器
	Router(long long xx, long long yy, bool a = false) :x(xx), y(yy), addRouter(a) {}
};

int n, m, k, r;
vector<Router> routers;//存储所有的路由器 

bool isConnect(const int r1,const int r2) {
	return (routers[r1].x - routers[r2].x)*(routers[r1].x - routers[r2].x) + 
		(routers[r1].y - routers[r2].y)*(routers[r1].y - routers[r2].y) <= (long long)r*r;
}

int main() {
	cin >> n >> m >> k >> r;
	long long xx, yy;
	while (n--) {
		cin >> xx >> yy;
		routers.push_back(Router(xx, yy));
	}
	while (m--) {
		cin >> xx >> yy;
		routers.push_back(Router(xx, yy, true));
	}
	vector<bool> inQueue(routers.size(), false);//记录该路由器是否在队列中
	queue<int> q;//路由器队列 
	q.push(0);//将第一个路由器插入队列
	inQueue[0] = true;
	while (!q.empty()) {//关键步骤,BFS 
		int rr = q.front();
		q.pop();
		if (rr == 1)//从0到1即从第一个路由器到达第二个路由器 
			break;
		for (int i = 0; i < routers.size(); i++) {
			if (!inQueue[i] && isConnect(rr, i)) {//如果该路由器不在队列中且可以将它们两个连接,说明发现了一条到达该路由器的路径,将该路由器加入到队列中 
				if (routers[i].addRouter&&routers[rr].addNum + 1 > k)
					continue;//如果超出题目要求的k值,则检测下一个路由器
				routers[i].cost = routers[rr].cost + 1;
				routers[i].addNum += routers[rr].addNum + routers[i].addRouter ? 1 : 0;
				inQueue[i] = true;
				q.push(i);
			}
		}
	}
	cout << routers[1].cost - 1;
	return 0;
}

201312-1.出现次数最多的数

#include <iostream>
#include <map>
using namespace std;

int main() {
	int n, num;
	cin >> n;
	map<int, int> m;
	for (int i = 0; i < n; i++) {
		cin >> num;
		if (m.count(num))
			m[num]++;
		else
			m[num] = 1;
	}
	auto ans = m.begin();
	for (auto it = m.begin(); it != m.end(); it++)
		if (it->second > ans->second)
			ans = it;
	cout << ans->first;
	return 0;
}

201312-2.ISBN号码

#include <iostream>
using namespace std;

int main() {
	char ch[13];
	cin >> ch;
	int ans = (ch[0] - '0' + (ch[2] - '0') * 2 + (ch[3] - '0')
		* 3 + (ch[4] - '0') * 4 + (ch[6] - '0') * 5 + (ch[7] - '0')
		* 6 + (ch[8] - '0') * 7 + (ch[9] - '0') * 8 + (ch[10] - '0') * 9) % 11;
	if ((ans == 10 && ch[12] == 'X') || ans == (ch[12] - '0'))
		cout << "Right";
	else if (ans == 10) {
		ch[12] = 'X';
		cout << ch;
	}
	else {
		ch[12] = ans + '0';
		cout << ch;
	}
	return 0;
}

201312-3.最大的矩形

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
		cin >> v[i];
	int ans = v[0];
	for (int i = 0; i < n; i++) {
		int min = v[i];
		for (int j = i; j < n; j++) {
			if (v[j] < min)
				min = v[j];
			if ((j - i + 1)*min > ans)
				ans = (j - i + 1)*min;
		}
	}
	cout << ans;
	return 0;
}