【浙大PTA:L1系列题目】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
/*
公式一。
等差数列求和
Sn=(a1+an)×n/2
Sn=na1+n(n-1)d/2
通项an=a1+(n-1)d 
2n+1
1 3 5 7 9
0 1 2 3 4 
 
*/
int n;
char c;
bool check(int x){
	int sum=(3*x+x*(x-1))*2+1;
	return (n-sum)>=0;
} 
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	//2分
	cin>>n>>c;
	if(n<7)return !(cout<<c<<endl<<n-1);
	int l=1,r=n+1;
	while(l<r){
		int mid=(l+r+1)>>1;
		if(check(mid))l=mid;
		else r=mid-1;
	}
	int top=l*2+1;
	int space=0;
	for(int i=top;i>1;i-=2){
		cout<<string(space,' ');
		cout<<string(i,c)<<endl;
		++space;
	} 
	cout<<string(space,' ');
	cout<<c<<endl;
	--space;
	for(int i=3;i<=top;i+=2){
		cout<<string(space,' ');
		cout<<string(i,c)<<endl;
		--space;
	}
	--top;
	cout<<n-((3*l+l*(l-1))*2+1);
	return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main(){
	map<char,int>dict;
	string s;cin>>s;
	for(int i=0;i<s.size();++i){
		++dict[s[i]];
	}
	for(auto& it:dict){ 
		cout<<it.first<<":"<<it.second<<endl;
	}
	return 0;
}

在这里插入图片描述

map,set的本质是异质数组,pair,tuple是单元素

///1
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;cin>>n;
	tuple<string,int,int>info[n+1];
	string a;int b,c;
	for(int i=1;i<=n;++i){
		cin>>a>>b>>c;
		get<0>(info[i])=a;
		get<1>(info[i])=b;
		get<2>(info[i])=c;
	}
	int m;cin>>m;
	while(m--){
		cin>>b;
		for(int i=1;i<=n;++i){
			if(get<1>(info[i])==b){
				cout<<get<0>(info[i])<<" "<<get<2>(info[i])<<endl;
			}
		}
	}
}
/2
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;cin>>n;
	map<int,pair<string,int>> hx;
	string a;int b,c;
	for(int i=1;i<=n;++i){
		cin>>a>>b>>c;
		hx[b]=make_pair(a,c);
		//hx.insert(make_pair(b,make_pair(a,c))); 也可
	}
	int m;cin>>m;
	while(m--){
		cin>>b;
		cout<<hx[b].first<<" "<<hx[b].second<<endl;
	}
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
map<int,string>dict{
{0,"ling"},
{1,"yi"},
{2,"er"},
{3, "san"},
{4, "si"},
{5, "wu"},
{6, "liu"},
{7, "qi"},
{8, "ba"},
{9, "jiu"}
};
int main(){
	ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
	string s;cin>>s;
	auto it=s.begin();
	if(*s.begin()=='-'){
		cout<<"fu ";++it;
	}
	for(;it<s.end();++it){
		cout<<dict[*it-'0']<<" "[it+1==s.end()];
	}
	return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define li long int
void gcd(li& x,li& y) {
	li g=__gcd(x,y);//求最大公因数 
	x/=g;y/=g;//约分 
}
int main() {
	int n;cin>>n;
	li a,b,x,y;
	scanf("%ld/%ld",&a,&b);//a分子,b分母 
	for (int i=1;i<n;++i) {
		scanf("%ld/%ld",&x,&y);
		a=a*y+ b*x;
		b*=y;
		gcd(a,b);
	}
	if(a%b == 0)cout<<a/b<<endl; 
    else{
        if(a/b)//当分子大于分母 
            cout<<a/b<<" ";
	        cout<<a - a/b*b <<"/"<<b<< endl;
    }
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
	int a,b;cin>>a>>b;int sum=0;
	for(int i=a,pos=1;i<=b;++i,++pos){
		cout<<right<<setw(5)<<i<<"\n"[pos%5!=0];//false执行
		sum+=i; 
		if(i==b&&pos%5!=0)cout<<endl;
	}
	cout<<"Sum = "<<sum;
	return 0;
}

在这里插入图片描述

异或交换

#include<bits/stdc++.h>
using namespace std;
void exc(int& a,int& b){
	a^=b;
	b^=a;
	a^=b;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int a,b,c;
	cin>>a>>b>>c;
	if(a>b)exc(a,b);
	if(a>c)exc(a,c);
	if(b>c)exc(b,c);
	cout<<a<<"->"<<b<<"->"<<c;
} 

在这里插入图片描述

考察含空格的字符串读取,删除的逻辑

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s1,s2;
	getline(cin,s1);//按行读取
	getline(cin,s2);
	sort(s2.begin(),s2.end());
	for(int i=0;i<s1.size();++i){
		for(int j=0;j<s2.size();++j){
			if(s2[j]>s1[i])break;//剪枝
			if(s1[i]==s2[j]){
				s1.erase(i,1);
				--i;//删除当前,则下一个元素应仍是当前
			}
		}
	}
	cout<<s1<<endl;
	return 0;
}

在这里插入图片描述

自写快速幂,实质pow即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline ll fastpow(ll base,ll power,ll mod){
	ll ans=1;
	base%=mod;
	while(power){
		if(power&1)ans=ans*base%mod;
		base=base*base%mod;
		power>>=1;
	}
	return ans;
}
int main(){
	int power;cin>>power;
	cout<<"2^"<<power<<" = "<<fastpow(2,power,1025);//最大为1024
	return 0;
}

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int curjc=1,sum=0;
int main(){
	int n;cin>>n;
	for(int i=1;i<=n;++i){
		curjc*=i;
		sum+=curjc;
	}
	cout<<sum;
	return 0;
}

在这里插入图片描述

四舍五入

#include<bits/stdc++.h>
using namespace std;
int lop(double n){
	int zhengshu=n*10;
	if(zhengshu%10>4)return ceil(n);
	else return floor(n);
}
int main(){
	int n;char c;
    cin>>n>>c;
    int loop=lop((double)n/2);
//    cout<<loop<<endl;
    for(int i=1;i<=loop;++i){
        for(int j=1;j<=n;++j){
            cout<<c;
        }
        cout<<endl;
    }
	return 0;
}

在这里插入图片描述

键值hash:unordered_map<int,char>
加权求和:Σ(值i×权i)
字符串每一元素是字符

#include<bits/stdc++.h>
using namespace std;
int w[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
unordered_map<int,char>haxi{{0,'1'},{1,'0'},{2,'X'},{3,'9'},{4,'8'},{5,'7'},{6,'6'},{7,'5'},{8,'4'},{9,'3'},{10,'2'}};
vector<string>ans;
string s;
int sum;
bool flag;
int main(){
	int n;cin>>n;
	vector<string>str(n+1);
	for(int i=1;i<=n;++i)cin>>str[i];//读 
	
	for(int i=1;i<=n;++i){//处理每一个字符串 
		sum=0;flag=true;
		for(int j=0;j<17;++j){
			if(!isdigit(str[i][j])){
				ans.push_back(str[i]);
				flag=false;
				break;
			}
			sum+=((str[i][j]-'0')*w[j]);
		}
//		cout<<str[i][17]<<" "<<haxi[sum%11]<<" "<<sum%11<<endl; 
		if(haxi[sum%11]!=str[i][17]&&flag)ans.push_back(str[i]);
	}
	
	if(!ans.empty()){
		for(string& s:ans)cout<<s<<endl;
	}else cout<<"All passed";
	return 0;
}
/*
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
*/

在这里插入图片描述

天梯赛喜欢考一些,处理某个位以后(for的i),消除产生差位,或者基于其他原则产生进位
(double)int/int
ll不足50位
奇数偶数判断直接看最后一位%2

#include<bits/stdc++.h>
using namespace std;
#define ll long long
string nums;
int pos;
int er;
int weishu;
double ans=1;
int main(){
	ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
	cin>>nums;
	weishu=nums.size();
	if(nums[0]=='-'){
		pos=1;
		--weishu;
		ans*=1.5;
	}
	if((nums.back()-'0')%2==0)ans*=2;
	
	for(;pos<nums.size();++pos)if(nums[pos]=='2')++er;
	ans*=(double)er/weishu;
	cout<<fixed<<setprecision(2)<<ans*100<<"%";
	//-13142223336
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
vector<int>path;
struct node{
	int data;
	node* lson,* rson;
//	node(int w){data=w;lson=rson=nullptr;}
	node(int x):data(x),lson(nullptr),rson(nullptr){}
}; 
node* ins(node* root,int val){ 
	if(root==nullptr)root=new node(val);
	else if(val<root->data)root->lson=ins(root->lson,val);
	else if(val>=root->data)root->rson=ins(root->rson,val);
	return root;
}
void pretra(node* root){
	if(root==nullptr)return; 
	cout<<root->data<<" ";
	pretra(root->lson);
	pretra(root->rson);
}
void intra(node* root){
	if(root==nullptr)return;
	intra(root->lson);
//	cout<<root->data<<" ";
	path.push_back(root->data);
	intra(root->rson);
}
void latra(node* root){
	if(!root)return;
	latra(root->lson);
	latra(root->rson);
//	cout<<root->data<<" ";
	path.push_back(root->data);
}
node* rvs(node* root){
	if(!root)return nullptr;
	swap(root->lson,root->rson);
	rvs(root->lson);
	rvs(root->rson);
	return root;
}
int maxH(node* root){
	if(!root)return 0;
	int lH=maxH(root->lson);
	int rH=maxH(root->rson);
	if(!root->lson&&root->rson)return 1+rH;
	if(root->lson&&root->lson)return 1+lH;
	return 1+max(lH,rH);
}
int minH(node* root){
	if(!root)return 0;
	int lH=minH(root->lson);
	int rH=minH(root->rson);
	if(!root->lson&&root->rson)return 1+rH;
	if(root->lson&&root->lson)return 1+lH;
	return 1+min(lH,rH);
}
int main(){
	int n;cin>>n;
	queue<int>ele;int temp;
	int rt;cin>>rt;
	node* root=new node(rt);
	for(int i=0;i<n-1;++i){cin>>temp;ele.push(temp);}	
	while(!ele.empty()){
		ins(root,ele.front());ele.pop();
	}
	if(abs(maxH(root)-minH(root))>1){
		cout<<"@";
		rvs(root);
		if(abs(maxH(root)-minH(root))>1){
			cout<<"NO";
		}
		else{
			cout<<"()";
			latra(root);
			for(int& x:path)cout<<x<<" "; 
		}
	}else{
		cout<<"!";
		latra(root);
		for(int& x:path)cout<<x<<" "; 
	}
//	intra(root);
//	if(is_sorted(path.begin(),path.end())){
//		cout<<"YES"<<endl;
//		path.clear();
//		latra(root);
//		for(int& x:path)cout<<x<<" "; 
//	}else{
//		cout<<"@"<<endl;
//		rvs(root);
//		path.clear();
//		intra(root);
//		if(is_sorted(path.begin(),path.end())){
//			cout<<"YES"<<endl;
//			rvs(root);
//			path.clear();
//			latra(root);
//			for(int& x:path)cout<<x<<" "; 
//		}else{
//			cout<<"NO";
//		}
//		
//	}
}
/*
7
8 6 5 7 10 8 11
*/

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
vector<int>seq;//原树前序 
vector<int>preseq;//搜索树前序 
vector<int>lastseq;//镜像搜索树前序 
vector<int>preseqM;//搜索树后序 
vector<int>lastseqM;//镜像搜索树后序 
//其实深搜容器一个就行,判断不是则clear再换序读入 
struct node{
	int data;
	node* lson,*rson;
//	node(int a){data=a;lson=nullptr;rson=nullptr;}//都可 
	node(int a):data(a),lson(0),rson(0){}
};
node* ins(node*& root,int val){//以根结点指针引用*&建立搜索二叉树,若为空树则建树返回根,不为空则按照规则插入 
	if(!root){
		root=new node(val);
		return root;
	}
	if(val<root->data)ins(root->lson,val);
	if(val>=root->data)ins(root->rson,val);
	return root;//记得return,不返回则pta段错误 
}
/*建立二叉搜索树的镜像反转 
//还有解法是读取时建立两棵树 
void insertM(node *&root,int val){
    if(!root){
		root=new node(val);
		return root;
	}
    if (data > root->data)insertM(root->left, data);
    else insertM(root->right, data);
    return root;
}
*/ 
//几个深搜遍历 
void pretra(node* root){
	if(!root)return;
	preseq.push_back(root->data); 
	pretra(root->lson);
	pretra(root->rson);
}
void pretraM(node* root){
	if(root==nullptr)return;
	preseqM.push_back(root->data);
	pretraM(root->rson);
	pretraM(root->lson);
}
void lasttra(node* root){
	if(root==nullptr)return;
	lasttra(root->lson);
	lasttra(root->rson);
	lastseq.push_back(root->data);
}
void lasttraM(node* root){
	if(root==nullptr)return;
	lasttraM(root->rson);
	lasttraM(root->lson);
	lastseqM.push_back(root->data);
}
int main(){
	ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
	int n,temp;cin>>n;
	node* root=nullptr;
	for(int i=0;i<n;++i){
		cin>>temp;
		seq.push_back(temp);
		ins(root,temp);//读取顺便建树 
	}
	pretra(root);
	pretraM(root);
	if(preseq==seq){
		cout<<"YES"<<endl;
		lasttra(root);
		for(auto i=lastseq.begin();i<lastseq.end();++i){
			cout<<*i;
			if(i<lastseq.end()-1)cout<<" "; 
		}
	}else {
		if(preseqM==seq){
			cout<<"YES"<<endl;
			lasttraM(root);
			for(auto i=lastseqM.begin();i<lastseqM.end();++i){
				cout<<*i<<" "[i + 1 == lastseqM.end()];//若表达式为true则不执行 
				//如果不想最后一个元素末尾输出该输出位的东西,用布尔数组里面嵌套表达式
				 
			}
		}else{
			cout<<"NO";
		}
	}
	return 0;
}

L2-048 寻宝图

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define VI vector<int> 
#define VVI vector<vector<int>>
int n,m;
long long bao,dao;
bool isd=false,isb=false;//岛,宝 
//我tom的还以为斜线也算弄了好久 
//int dirx[9]{0,-1,-1,-1,0,0,1,1,1};
//int diry[9]{0,-1,0,1,-1,1,-1,0,1};
int dirx[5]{0,-1,0,0,1};
int diry[5]{0,0,-1,1,0};

//这个题比较鞥新,因为不可以预定义地图大小,nm是不定量,但都开1e5要爆
//vector二维数组好传一些 
void inline dfs(const int& sx,const int& sy,VVI &arr,VVI &vis){ 
	if(!arr[sx][sy])return;
	vis[sx][sy]=true;//已经访问 
	if(arr[sx][sy]==1)isd=true;
	if(arr[sx][sy]>1)isd=isb=true;
	for(int i=1;i<=4;++i){
		int adjx=sx+dirx[i],adjy=sy+diry[i];
		if(adjx>n||adjx<1||adjy>m||adjy<1)continue;
		if(vis[adjx][adjy])continue;
		if(arr[adjx][adjy])dfs(adjx,adjy,arr,vis);
	}
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	if(n==1&&m==1){
		cin>>n;
		if(n>1)cout<<1<<" "<<1;
		else if(n==1)cout<<1<<" "<<0;
		else cout<<0<<" "<<0;
		return 0;
	}
	VVI arr(n+10,VI(m+10,0));
	VVI vis(n+10,VI(m+10,false));
	
	for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){char temp;cin>>temp;arr[i][j]=temp-'0';}
	
	for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
		if(!vis[i][j]){
			isb=false;isd=false;//重置 
			dfs(i,j,arr,vis);
			if(isd)++dao;
			if(isb)++bao;
		}
	}
	cout<<dao<<" "<<bao;
	return 0;
}

L3-007 天梯地图
在这里插入图片描述

在这里插入图片描述

20分做法

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=520;
int n,m,v1,v2,len,tim,start,tar;
bool flag;
struct node{
	int id;ll cost_len,cost_time;
	node(int a,ll b,ll c){id=a;cost_time=b;cost_len=c;}
	node(int a,ll b){id=a;cost_time=b;}
	bool operator < (const node& cur) const {return cur.cost_time<cost_time;};
};
struct edge{
	int to;ll wlen,wtime;
	edge(int a,ll b,ll c){to=a;wtime=b;wlen=c;}	
};
vector<edge>adj[N];
int dis[N];
priority_queue<node>wait;
bool ismin[N];
int pre[N];
void dj(){
	while(!wait.empty()){
		node cur=wait.top();wait.pop();
		if(ismin[cur.id])continue;
		ismin[cur.id]=true;
		for(auto e:adj[cur.id]){
			if(ismin[e.to])continue;
//			cout<<cur.id<<" "<<dis[e.to]<<" "<<e.to<<" "<<e.wtime<<" "<<cur.cost_time<<endl;
			if(dis[e.to]>e.wtime+cur.cost_time){
				dis[e.to]=e.wtime+cur.cost_time;
//				cout<<"@"<<e.wtime<<" "<<cur.cost_time<<endl; 
				wait.push(node(e.to,dis[e.to]));
				pre[e.to]=cur.id;
			}
		}
	}
} 
vector<int>path1;
vector<int>path2;
void print_path1(int start,int end){		  
    if(start!=end)print_path1(start,pre[end]);
    path1.push_back(end);
	return;		                    
}
void print_path2(int start,int end){		  
    if(start!=end)print_path2(start,pre[end]);
    path2.push_back(end);
	return;		                    
}
bool check(){
	if(path1.size()!=path2.size())return false;
	for(int i=0;i<path1.size();++i){
		if(path1[i]!=path2[i])return false;
	}
	return true;
}
int main(){
	memset(dis,0x7f,sizeof(dis));
	memset(ismin,false,sizeof(ismin));
	memset(pre,0x7f,sizeof(pre));
	path1.clear();
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		cin>>v1>>v2>>flag>>len>>tim;
		adj[v1].push_back(edge(v2,tim,len));
		if(!flag)adj[v2].push_back(edge(v1,tim,len));
	}
	cin>>start>>tar;
	dis[start]=0;wait.push(node(start,0));
	dj();
	int ans1=dis[tar];
//	cout<<"Time = "<<ans1<<": ";
	print_path1(start,tar);
//	for(int i=0;i<path1.size();++i)cout<<path1[i];
//	cout<<endl;

	path2.clear();
	memset(dis,0x7f,sizeof(dis));
	memset(ismin,false,sizeof(ismin));
	memset(pre,0x7f,sizeof(pre));
	while(!wait.empty())wait.pop();
	for(int i=0;i<n;++i)for(auto& e:adj[i])e.wtime=e.wlen;
	dis[start]=0;wait.push(node(start,0));
	dj();
	int ans2=dis[tar];
//	cout<<"Distance = "<<ans2<<": ";
	print_path2(start,tar);
//	for(int i=0;i<path2.size();++i)cout<<path2[i];
	if(check()){
		cout<<"Time = "<<ans1<<"; Distance = "<<ans2<<": ";
		for(int i=0;i<path1.size();++i){
			cout<<path1[i];
			if(i!=path1.size()-1)cout<<" => ";
		}
	}else{
		cout<<"Time = "<<ans1<<": ";
		for(int i=0;i<path1.size();++i){
			cout<<path1[i];
			if(i!=path1.size()-1)cout<<" => ";
		}
		cout<<endl;
		cout<<"Distance = "<<ans2<<": ";
		for(int i=0;i<path2.size();++i){
			cout<<path2[i];
			if(i!=path2.size()-1)cout<<" => ";
		}
	}
	
	cout<<endl;
}

L2-001 紧急救援
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 510;
struct edge{
	int to;ll w;
	edge(int a,ll b):to(a),w(b){}
};
vector<edge>adj[N];
vector<int>rs(N,0);
int n,m,start,tar,pathlen,minpaths;
vector<bool>vis(N,false);
vector<int>path;
vector<vector<int>>ans;
void inline dfs(int start){
	if(start==tar){
		path.push_back(pathlen);
		ans.push_back(path);
		path.pop_back();
		return;
	}
	for(const edge& e:adj[start]){
		if(vis[e.to])continue;
		path.push_back(e.to);
		pathlen+=e.w;
		vis[e.to]=true;
		dfs(e.to);
		path.pop_back();
		pathlen-=e.w;
		vis[e.to]=false;
	}
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>start>>tar;//点数,边数,起点城市,终点城市
	for(int i=0;i<n;++i)cin>>rs[i];
	for(int i=0;i<m;++i){
		int v1,v2,w;
		cin>>v1>>v2>>w;
		adj[v1].push_back(edge(v2,w));
		adj[v2].push_back(edge(v1,w));
	} 
	path.push_back(start);
	vis[start]=true;
	dfs(start);
//	cout<<"通路有:\n";
//	for(auto e:ans){
//		for(int x:e){
//			cout<<x<<" ";
//		}
//		cout<<endl;
//	}
	int minn=INT_MAX;
	int maxn=INT_MIN;
	for(auto it=ans.begin();it<ans.end();++it){
		if(it->back()<minn)minn=it->back();
	}
	int pos=0,anspos;
	for(auto it=ans.begin();it<ans.end();++it){
		if(it->back()==minn){
			minpaths++;
			int sum=0;
			for(auto itt=it->begin();itt<it->end()-1;++itt){
				sum+=rs[*itt];
			}
			if(sum>maxn){
				maxn=sum;
				anspos=pos;
			}
		}
		++pos;
	}
	cout<<minpaths<<" "<<maxn<<endl;
//	cout<<" "<<anspos;
	for(auto it=ans[anspos].begin();it<ans[anspos].end()-1;++it){
		cout<<*it<<" "[it+1!=ans[anspos].end()-1];
	}
	
	return 0;
}
/*
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值