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