A.一千万零一只斑点狗

题意:给定一个数N,若N为1~26,输出a~z,若N为27~702,输出aa~zz,若N为703~18278,输出aaa~zzz,以此类推。 思路:将N转换为26进制。 错因:没有好思路。 代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("dog.in","r",stdin);
	freopen("dog.out","w",stdout);
	string s;
	long long n,i=1;
	cin>>n;
	while(n)
	{
		n--;
		s[i]=n%26+'a';
		i++;
		n/=26;
	}
	for(long long j=i-1;j>0;j--)
	{
		cout<<s[j];
	} 
	return 0;
} 

C.走迷宫

题意:给定一个由 N×M 个方格组成的网格。#表示墙,.表示路,求从任意的起点和终点的最短路的最大步数。 思路:枚举法。 代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int n, m;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int g[25][25];
int dist[25][25];
int bfs(int a, int b)
{
	memset(dist, -1, sizeof dist);
	queue<PII> q;
	q.push({a, b});
	dist[a][b] = 0;
	int res = 0;
	while(!q.empty())
	{
		auto p = q.front();
		q.pop();
		for(int i = 0; i < 4; i++)
		{
			int nx = p.first + dx[i], ny = p.second + dy[i];
			
			if(nx < 1 || nx > n || ny < 1 || ny > m || g[nx][ny] == 0 || dist[nx][ny] != -1)
				continue;
			
			q.push({nx, ny});
			dist[nx][ny] = dist[p.first][p.second] + 1;
			res = max(res, dist[nx][ny]);
		}
	}
	return res;
}
int main()
{
	freopen("maze.in", "r", stdin);
	freopen("maze.out", "w", stdout);
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
		{
			char c;
			cin >> c;
			if(c == '.') g[i][j] = 1;
			else g[i][j] = 0;
		}
	int ans = -1;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
		{
			if(g[i][j] == 0 ) continue;
			ans = max(ans, bfs(i, j));
		}
	cout << ans << endl;
	return 0;
}

D.划分问题

题意:有N道题,要求难度大于等于K的题目数等于难度小于K的题目。求有多少种K。 思路:输出中间两个数的差。 代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("hf.in","r",stdin);
	freopen("hf.out","w",stdout);
	int n,k=0;
	cin>>n;
	int a[n];
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		a[i]=x;
	}
	sort(a+1,a+n+1);
	int d=n/2;
	k=a[d+1]-a[d];
	cout<<k;
	return 0;
} 

E.序列查询

题意:对一个空序列进行Q个查询。 1.1 x:将x插入A。 2.2 x k:在A中小于等于x的元素中,输出第k大值。(k不超过5)如果A中小于等于x的元素不足k个,则输出−1。 3.3 x k:在A中大于等于x的元素中,输出第k小的值。(k不超过5)如果A中大于等于x的元素不足k个,则输出−1。 思路:分类讨论,分3种情况。 代码:

#include<bits/stdc++.h>
using namespace std;
using LL = long long;
int main()
{
	freopen("list.in", "r", stdin);
	freopen("list.out", "w", stdout);
	multiset<LL> s;
	int q;
	cin >> q;
	while(q --)
	{
		LL op, x, k;
		cin >> op >> x;
		if(op == 1)
		{
			s.insert(x);
		}
		else if(op == 2) 
		{
			cin >> k;
			auto it = s.upper_bound(x);
			bool flag = true;
			while(k -- && it != s.begin()) it --;
			if(k >= 0 || it == s.end()) flag = false;
			cout << (flag?*it:-1) << endl;
		}
		else 
		{
			cin >> k;
			auto it = s.lower_bound(x) ;
			while(--k && it != s.end()) it ++;
			if(it == s.end()) cout << -1 << endl;
			else cout << *it << endl;
		}
	}
	return 0;
}