链接
熟悉map和vector的操作, 特别是map的,vector只是充当一个队列的储存.
//map.count(k); 算出map中有多少个k, 其中k为map的key值.
//一个find Vector的例子(BAIDU里找的),注意find不属于vector的成员,而存在于算法中,应加上头文件#include :
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main( )
{
vector<int> L;
L.push_back( 1 );
L.push_back( 2 );
L.push_back( 3 );
L.push_back( 4 );
L.push_back( 5 );
vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3
if ( result == L.end( ) ) //没找到
cout << "No" << endl;
else //找到
cout << "Yes" << endl;
}
AC Code
//太烦了,调了两小时的BUG, 最后是用了迭代器的问题, 还少打了句号.
//注意几点:最后说Bye时只跟说过话的妹子说. 如果有标记,则先和标记说. 每一步都要去考虑到标记.
/** @Cain*/
const int maxn=1e4+5;
int cas=1;
char s[maxn];
vector<int>ve;
map<int,ll>mp;
void solve()
{
int n;
scanf("%d",&n);
ve.clear();
mp.clear();
int flag = -1;
for(int i=1;i<=n;i++){
scanf("%s",s);
int u;
printf("Operation #%d: ",i);
if(!strcmp(s,"Add")){
scanf("%d",&u);
if(mp.count(u)) printf("same priority.\n");
else{
ve.push_back(u); //推进vector.
mp[u] = 0; //放进map.注意此时的mp[u] = 0. 即没有单词.
printf("success.\n");
}
}
else if(!strcmp(s,"Close")){
scanf("%d",&u);
if(mp.count(u)){
printf("close %d with %lld.\n",u,mp[u]);
mp.erase( u ); //这种需要想一下.就是如何进行这一步操作更好写.
ve.erase(find(ve.begin(),ve.end(),u));
}
else printf("invalid priority.\n");
}
else if(!strcmp(s,"Chat")){
scanf("%d",&u);
if(!ve.empty()){
printf("success.\n");
if(flag == -1) //注意判是否有标记.
mp[ve[0]] += u;
else
mp[flag] += u;
}
else printf("empty.\n");
}
else if(!strcmp(s,"Rotate")){
scanf("%d",&u);
if(u<0 || u>ve.size()) printf("out of range.\n");
else{
printf("success.\n");
int tmp = ve[u-1];
ve.erase(ve.begin()+u-1);
ve.insert(ve.begin(),tmp);
}
}
else if(!strcmp(s, "Prior")) {
if(ve.empty()) printf("empty.\n");
else {
int idx = 0;
for(int k = 0; k < ve.size(); k++)
if(ve[k] > ve[idx]) idx = k;
//直接暴力循环找出最大值.
int tmp = ve[idx];
//注意这些函数的参数都是迭代器,即类似于指针.
ve.erase(ve.begin() + idx);
ve.insert(ve.begin(), tmp);
printf("success.\n");
}
}
else if(!strcmp(s,"Choose")){
scanf("%d",&u);
if(mp.count(u)){
printf("success.\n");
ve.erase(find(ve.begin(),ve.end(),u));
ve.insert(ve.begin(),u);
}
else printf("invalid priority.\n");
}
else if(!strcmp(s,"Top")){
scanf("%d",&u);
if(mp.count(u)){
printf("success.\n");
flag = u;
}
else printf("invalid priority.\n");
}
else if(!strcmp(s,"Untop")){
if(flag == -1) printf("no such person.\n");
else{
printf("success.\n");
flag = -1;
}
}
}
if(flag != -1){
if(mp[flag])
printf("Bye %d: %lld\n",flag,mp[flag]);
mp[flag] = 0;
}
for(int i=0;i<ve.size();i++){
if(mp[ve[i]]) printf("Bye %d: %d\n",ve[i],mp[ve[i]]);
}
}