- 高士渠 的博客
day8
- @ 2025-7-22 20:57:30
今日难
T1
题目描述:输入一个整数n,将其以每个位置上为a--z排列;
要找到有一个数学公式,用多个n%26将n转为26进制,但是0为a,1为b,2为c......25为z; 输出转化后的n; 代码:
#include <bits/stdc++.h>
using namespace std;
vector<char>a;
int main (){
freopen("dog.in","r",stdin);
freopen("dog.out","w",stdout);
long long n;
cin>>n;
if(n==1){
cout<<"a";
return 0;
}
long long v=0,c=n;
while(n>=1){
v++;
n=n/26;
}
while(v>0){
c--;
char x=(c%26)+97;
a.push_back(x);
v--;
c=c/26;
}
reverse(a.begin(),a.end());
for(int i=0;i<a.size();i++){
if(a[i]=='`')continue;
cout<<a[i];
}
return 0;
}
T2
题目描述
金字塔的中心坐标为(CX,CY),高度为H,坐标 (X,Y)处的海拔高度max(H−∣X−CX∣−∣Y−CY∣,0)
输入xi,yi处的高
输出中心坐标为(CX,CY)和高h;
循环暴力遍历所有可能的中心坐标,用题目中的条件判断是否可行; 代码:
#include <bits/stdc++.h>
using namespace std;
long long x[110],y[110],h[110];
int main (){
freopen("tower.in","r",stdin);
freopen("tower.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>h[i];
if(h[i]>0){
swap(h[i],h[1]);
swap(x[i],x[1]);
swap(y[i],y[1]);
}
}
for(int xn=0;xn<=100;xn++){
for(int yn=0;yn<=100;yn++){
long long hn,t=0;
hn=h[1]+abs(x[1]-xn)+abs(y[1]-yn);
for(int i=2;i<=n;i++){
if(hn-abs(x[i]-xn)-abs(y[i]-yn)!=h[i]){
t=1;
break;
}
}
if(t==0){
cout<<xn<<" "<<yn<<" "<<hn;
return 0;
}
}
}
return 0;
}
T3
题目描述:输入一个迷宫,输出任意起点终点最短路的最大数;
遍历每一个起点终点,用广搜找出最短路的最大数;
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[50][50];
int cnt[50][50];
int v[50][50];
int dx[5]={0,1,0,-1};
int dy[5]={1,0,-1,0};
bool ch(int nx,int ny){
if(nx>0&&ny>0&&nx<n+1&&ny<m+1&&!v[nx][ny]&&a[nx][ny]!='#')return 1;
return 0;
}
void bfs(int qx,int qy,int zx,int zy){
queue< pair<int,int> > q;
q.push({qx,qy});
v[qx][qy]=1;
cnt[qy][qx]=0;
while(q.size()){
auto t=q.front();
q.pop();
int x=t.first;
int y=t.second;
if (x==zx&&y==zy) {
ans=max(ans,cnt[x][y]);
return;
}
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if (ch(nx,ny)){
v[nx][ny]=1;
q.push({nx,ny});
cnt[nx][ny]=cnt[x][y]+1;
}
}
}
}
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++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!='#'){
for(int k=1;k<=n;k++){
for(int e=1;e<=m;e++){
if(a[i][j]!='#'){
memset(cnt, 0, sizeof cnt);
memset(v, 0, sizeof v);
bfs(i,j,k,e);
}
}
}
}
}
}
cout<<ans;
return 0;
}
T4
对了!!!;
T5
题目描述:定义一个序列,根据输入的指令对序列进行修改;
用平衡数 multiset作为序列;
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
multiset<ll> a;
int q;
int main ()
{
freopen("list.in", "r", stdin);
freopen("list.out", "w", stdout);
cin>>q;
while (q--)
{
int n;
cin>>n;
if(n==1){
ll x;
cin>>x;
a.insert(x);
}
else if(n==2){
ll x,k;
cin>>x>>k;
auto ans=a.upper_bound(x);
int f=1;
while(k--&&ans!=a.begin())ans--;
if(k>=0||ans==a.end())f=0;
if(f==1)cout<<*ans<<endl;
else cout<<"-1"<<endl;
}
else{
ll x,k;
cin>>x>>k;
auto ans=a.lower_bound(x);
int f=1;
k--;
while(k--&&ans!=a.end())ans++;
if(k>=0||ans==a.end())f=0;
if(f==1)cout<<*ans<<endl;
else cout<<"-1"<<endl;
}
}
return 0;
}