一、生成排列
头文件: #include
1:bool next_permutation(begin, end);改变区间内元素的顺序,产生下一个排列。
2:bool prev_permutation(begin, end);产生前一个排列。3:end 为最后一个元素的下一个位置4:upper_bound(begin, end, value);返回>value的元素的第一个位置。
5:lower_bound(begin, end, value);返回>=value的元素的第一个位置。
二、set和multiset的应用
set 和 multiset会根据特定的排序准则,自动将元素排序,两者的不同之处在于multiset可以允许元素重复而set不允许元素重复。
头文件: #include
定义:set <data_type> set_name;
如:set s;//默认由小到大排序如果想按照自己的方式排序,可以重载小于号。
struct new_type
{ int x, y;
bool operator < (const new_type &a)const{
if(x != a.x)
return x < a.x;
return y < a.y;
}
}//起作用的是return 后的><;
set <new_type> s;
操作:
1:s.insert(elem) – 安插一个elem副本,返回新元 素位置
2: s.erase(elem) – 移除与elem元素相等的所有元素,返回被移除的元素个数。
3:s.erase(pos) – 移除迭代器pos所指位置上的元素,无返回值。
4:s.clear() – 移除全部元素,将整个容器清空
5:s.size() – 返回容器大小。
6:s.empty() – 返回容器是否为空。
7:s.count(elem) – 返回元素值为elem的元素的个数。
8:s.lower_bound(elem) – 返回 元素值>= elem的第一个元素位置。
9:s.upper_bound(elem) – 返回元素值 > elem的第一个元素的位置。
10:s.begin() – 返回一个双向迭代器,指向第一个元素。
11:s.end() – 返回一个双向迭代器,指向最后一个元素的下一个位置
三、map和multimap
所有元素都会根据元素的键值自动排序,map的所有元素都是pair,pair的第一个元素被视为键值,第二个元素为实值。map不允许两个元素有相同的键值,但multimap可以。
头文件: #include
中文大概:
许多工作人员住在一个叫做Mzone的地方,远离他们的办公室(4.5公里)。由于交通不便,许多工作人员选择骑自行车。我们可以假设,除了“weiwei”之外,所有的人都会以固定的速度从家到办公室。魏伟是一个有着不同的骑术习惯的人–他总是试图跟随另一个骑手,以避免独自骑车。weiwei到了Mzone的门口,就会找一个要去办公室的人。如果他找到了一个人,他就会跟着那个骑手,如果不是,他会等着有人跟着他。在从家里到办公室的路上,如果一个速度更快的骑手超过了weiwei,他就会离开他所跟踪的骑手,并加快速度跟上那个更快的骑手。我们假设weiwei到达Mzone大门的时间是0。考虑到其他人的时间和速度,你的任务是给weiwei到达办公室的时间。
输入有几个测试用例。每个案例的第一行是N(1<=N<=10000),代表骑手的数量(不包括weiwei)。n=0结束输入。以下N行是N个不同骑手的信息,格式如下:VI[TAB]Ti。VI是一个正整数<=40,表示每位骑手的速度(每小时公里).TI是第一骑手的出发时间,它是一个整数,以秒为单位计算.在任何情况下,都可以保证总有一个非负Ti。
每组输出一行:weiwei的到达时间。在处理分数时把(上限)值集合起来。
提到取上限,就用ceil函数,在中。
这题像追击问题,后面的骑手追weiwei,追上后,weiwei再追上同行,直到追上最快的和他一起到达。
如果讨论weiwei会很麻烦,weiwei的速度和路程一直在变。而其他骑手,要么在等着耗时间,要么骑行花时间。而且weiwei会和最前面的骑手一起到达,时间都是从0秒开始,到达结束。所以,求出耗时最少的骑手所花时间就行。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{ int n,ans;
while(cin>>n)
{ if(n==0) break;
ans=1e9;
double v,t;
for(int i=1;i<=n;i++)
{ cin>>v>>t;
if(t>=0)
{ int time=ceil(t+4.5*3600/v);
ans=min(ans,time);
}
}
cout<<ans<<endl;
}
return 0;
}
贪心算法需要懂得思维变换和考虑周全。读不懂的题目,写出来,举例子说不定就明悟了。
测试没错,提交有错,就需要仔细检查代码以及试着找出反例来完善代码。