华为软件2020-4-30上机考试

1、输入一字符串,求其最多能排列组合多少种不同的字符串?

string str;

int help(int val);
int main(){
	char ch;
	while((ch=cin.get())!='\n')
		str.push_back(ch);
	if(str.size()==0){
        cout<<0<<endl;
        return 0;
    }
        //return 0;
	int res;
	map<char,int> map1;
	int count=0;
	for(int i=0;i<str.size();i++){
		map1[str[i]]++;
	}
	res=help(str.size());
	for(auto iter=map1.begin();iter!=map1.end();iter++){
		if(iter->second==1){
			continue;
		}
		int val=help(iter->second);
		res/=val;
	}
	cout<<res<<endl;
	return 0;
}

int help(int val){
	int res=1;
	for(int i=2;i<=val;i++){
		res*=i;
	}
	return res;
}

2、给定一个字符串,和一个数字k,问从字符串删除k个字符,使得删除后的字符串字典序最小,输出该字符串。

string str;
int k;
int main(){
	char ch;
	while((ch=cin.get())!='\n')
		str.push_back(ch);
	cin>>k;
	int index=0;
	int count=0;
	while(k){
		int start=count;
		char min=str[start];
		for(int i=count+1;i<=(k+start);i++){
			if(str[i]<min){
				index=i;
				min=str[i];
			}
		}
		k=k-(index-start);
		str.erase(start,index-start);
		count++;
	}
	cout<<str<<endl;
	return 0;
}

3、给定城市1-N,给定M条路,每条路有四个值,起始城市、到达城市、路长、过路费,求在给定费用下从1到达N的最短路径长度。

输入:

money

城市数量

道路数量

每条道路的属性

输出:最短路径长度,没有输出-1

int max_money;
int city_count;
int road_count;
int min_dis=1000000;

int main(){
	int res=-1;
	cin>>max_money;
	cin>>city_count;
	cin>>road_count;
	std::vector<std::vector<int> > vec;
	for(int i=0;i<road_count;i++){
		std::vector<int> v;
		int val;
		for(int i=0;i<4;i++){
			cin>>val;
			v.push_back(val);
		}
		vec.push_back(v);
	}
	help(vec,1,max_money,0);
	if(min_dis==1000000)
		cout<<-1<<endl;
	else
		cout<<min_dis<<endl;
	return 0;
}

void help(vector<vector<int>> &vec,int city,int money,int dis){
    if(money<0)
		return;    

	if(city==city_count){
		min_dis=min_dis<dis?min_dis:dis;
		return ;
	}
	
	for(auto v:vec){
		if(v[0]==city){
			help(vec,v[1],money-v[3],dis+v[2]);
		}
	}

}

猜你喜欢

转载自blog.csdn.net/csdnxxm/article/details/105853424