存疑601A(半解决)queue与sort的区别以及如何定义stl容器的优先级

题目http://codeup.cn/problem.php?cid=100000601&pid=0
代码2:以结构体来比较。所以,queue与sort的区别在哪里?排序之余还可以插入删除?不像sort的排序是另外的?
总结:心惊胆战的写完了结构体的方法,还好一次通过!
注意:
1.string 中find函数返回值可用int 存储。应该是-1。
2,字符串查找修改替换时都应用双引号"(".
3.friend bool 函数的使用,应是大括号。
4.优先级队列的使用和比较。
5.除了查找判断加没加入过,用judge循环来查找麻烦点。但也一般麻烦,只是个循环而已。所以要存储记录循环值,不然浪费时间。
6.我的代码考虑了有多个前序任务时的情况,此时按最低优先级执行。
7.本题用sort应该也可以,只是sort(t,t+cnt,cmp);一句代码的事。但queue创建了新队列。原结构体数组没有变化。

#include<cstdio>
#include<queue>
#include<string> 
#include<iostream>
using namespace std;
struct task{
	string name;
	int pri;
	friend bool operator < (task t1,task t2) {
		if(t1.pri!=t2.pri) return t1.pri<t2.pri;
		else return t1.name>t2.name;
	} 
}t[100000];
int cnt;
int judge(string s){
	for(int i=0;i<cnt;i++){
		if(s==t[i].name) return i;
	}
	return -1;
}
int main(){
	int n;
	string s,s0,s1;
	while(scanf("%d",&n)!=EOF){
		priority_queue<task> q; 
		cnt=0;
		int temppri;
		for(int i=0;i<n;i++){
			cin>>s;
			int it=s.find("(");
			s0.clear();
			s0.insert(s0.begin(),s.begin(),s.begin()+it);
			s.erase(s.begin(),s.begin()+it+1);//删除(前
			int tid=judge(s0);
			if(tid>=0){//加入过则得出其优先级 
				temppri=t[tid].pri;
			}else{//没有则加入并赋予最大优先级
				t[cnt].name=s0;
				t[cnt++].pri=n; 
				temppri=n;
				q.push(t[cnt-1]); 
			} 
			if(s!="NULL)"){//有后续任务则读取
				s.replace(s.length()-1,1,",");  
				while(s.length()>0){
					it=s.find(',');
					s1.clear();
					s1.insert(s1.begin(),s.begin(),s.begin()+it);
					s.erase(s.begin(),s.begin()+it+1);
					tid=judge(s1);
					if(tid>=0){//加入过则得出其优先级 
						if(temppri-1<t[tid].pri){
							t[tid].pri=temppri-1;
						}
					}else{//没有则加入并赋予最大优先级
						t[cnt].name=s1;
						t[cnt++].pri=temppri-1; 
						q.push(t[cnt-1]); 
					} 
				}
			} 
		}//读取完毕,则排序处理
		while(q.size()>1){
			printf("%s ",q.top().name.c_str());
			q.pop();
		}
		printf("%s\n",q.top().name.c_str());
	}
	return 0; 
}

代码1:
嫌结构体排序,查找麻烦,直接用map<string,int>mp,在map插入队列时,简直一团糟。另外,mp->first,mp->second的使用有问题。所以set,map等stl插入队列时的基本单位是什么?以size为标准比较?

#include<cstdio>
#include<queue>
#include<string> 
#include<map>
using namespace std;
/*struct task{
	string name;
	int pri;
};*///struct 查找不如map简便,写完map后,发现难度彼次彼此 
struct cmp{
	bool operator () (map<string,int> m1,map<string,int> m2){
		if(m1->second != m2->second)return m1->second < m2->second;
		else return m1->first > m2->first;//既然它与sort的cmp顺序相反 
	}
};
map<string,int> mp; 
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		string t,t0,t1;
		for(int i=0;i<n;i++){
			cin>>t;
			for(int j=0;j<t.length();j++){
				while(t[j]!='('){
					t0+=t[j];
				}
				if(mp.find(t0)==mp.end()){
					mp[t0]=n;//无前序,优先级最高 
				}
				t.erase(t.begin(),t.begin()+t0.length());
				if(t=="(NULL)") break;//下一行 
				else{
					t.erase(t.begin());//去掉左括号
					while(t.length()>0){
						t1.clear();
						if(mp.find(',')!=mp.end()){
							map<string,int>::iterator it=mp.find(',');
						}else{
							map<string,int>::iterator it=mp.find(')');
						}
						t1.insert(t1.begin(),t.begin(),it);
						if(mp.find(t1)!=mp.end()){
							if(mp[t0]-1<mp[t1]) mp[t1]=mp[t0]-1;//优先级低了才调 
						}else{
							mp[t1]=mp[t0]-1;//新加入 
						} 
						t.erase(t.begin(),it+1);//把,和)删掉 
					}  
				} 
			}
		} 
		//输入结束,该排优先级然后输出。
		//疑问:和sort区别在哪里,队列如何二级排序 
		priority_queue<map<string,int> ,vector<map<string,int> >,cmp > q; 
		for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++){
			q.push(*it);//存疑,map的基本元素是什么,一个map? 
		}
		//队列该怎么输出,也是迭代? 
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值