- 郭妍溪 的博客
7月DAY8
- @ 2025-7-23 21:22:47
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;
}