今天不用练车,花了一下午AK了训练1。
刚开始有一种廉颇老矣的感觉... 期末复习太久了..AC都不顺了么...
幸好手感很快就回来了..(摸摸头
ABCD都是Vector的,看到题目是给出main函数的我就知道大事不好了...
传值的时候要用vector<int> &vec,不然是不会调用拷贝函数的。
C题的话是不用去重的.. 一开始我没有清空栈,看到输出元素重复想都没想就去重了..然后EOF结束是用Bool来控制的。
bool Input(vector<int> &vec)
{
vec.clear();
int n,m,i;
if(scanf("%d",&n)==EOF)
return false;
for(i=0;i<n;i++)
{
scanf("%d",&m);
vec.push_back(m);
}
return true;
}
bool cmp(const int &a,const int &b)
{
return a>b;
}
void Sort(vector<int> &vec)
{
sort(vec.begin(),vec.end(),cmp);
}
WA了还傻夫夫的去问老师不用去重么... 好尴尬... So, 每次处理前记得vec.clear();
E题是stack的,这题RE了三发之后才发现是pop的时候忘记判断非空了,记得if(!st.empty())
G题优先队列默认是从大到小的
H题优先队列需要从小打到可以这样定义priority_queue<char, vector<char>, greater<char> > qu;
J题是我做了好一会的,map排序。map默认是用Key值排序的,题目还要求用Vaule排序,就开了个vector存进去再排序。
typedef pair<string, int> PAIR;
int cmp(const PAIR& x, const PAIR& y)
{
return x.second < y.second;
}
void SortOutput(map<string, int> &sm)
{
//string
map<string, int>::iterator it;
for(it=sm.begin();it!=sm.end();it++)
cout<<it->first<<" "<<it->second<<endl;
//int
vector<PAIR> vec;
map<string,int>::iterator it2;
for(it2=sm.begin();it2!=sm.end();it2++)
vec.push_back(make_pair(it2->first,it2->second));
sort(vec.begin(),vec.end(),cmp);
vector<PAIR>::iterator it3;
for(it3=vec.begin();it3!=vec.end();it3++)
cout<<it3->first<<" "<<it3->second<<endl;
}
K题全排列我傻夫夫的没有先sort,只输出了一个还想了好久... 所以用全排列先记得sort。
L题用了count之前没用过...贴一下吧..
int Find(vector<int> &vec,int x)
{
return count(vec.begin(),vec.end(),x);
}
M题用Lower_bound得到的不是int值,不能直接输出,所以要用pos-vec.begin()来输出(+1是位置从1开始)。
void PrintFind(vector<int> &vec,int x)
{
sort(vec.begin(),vec.end());
vector<int>::iterator pos;
pos=lower_bound(vec.begin(),vec.end(),x);
if(pos!=vec.end())
printf("%d\n",pos-vec.begin()+1);
else
printf("None\n");
}
O题也做了一会呢..优先队列的排序..转了一下思想,在结构体里写排序就可以了,重载函数差点就不会了呢..C++白学了...
struct Point
{
int x,y;
bool operator < (const Point &a) const
{
if(x!=a.x)
return x>a.x;
else
return y>a.y;
}
}point;
priority_queue<Point> qu;
void Input()
{
int n,i;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&point.x,&point.y);
qu.push(point);
}
}