TOJ寒假集训专题训练1-STL

今天不用练车,花了一下午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);		
	}
}








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值