今日难

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;	
}