第一题,点倒排,按要求的顺序输出坐标
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
int X,Y;
typedef struct P
{
int x,y;
bool operator < (const P & a)const
{
if ( (x-X)*(x-X)+(y-Y)*(y-Y)==(a.x-X)*(a.x-X)+(a.y-Y)*(a.y-Y) )
{
if (x==a.x)
return y<a.y;
else return x<a.x;
}
else return ( (x-X)*(x-X)+(y-Y)*(y-Y)<(a.x-X)*(a.x-X)+(a.y-Y)*(a.y-Y) );
}
}P;
int main()
{
int n,i;
P a[101];
cin>>X>>Y>>n;
for (i=0;i<n;i++)
cin>>a[i].x>>a[i].y;
sort(a,a+n);
for (i=0;i<n-1;i++)
cout<<"("<<a[i].x<<","<<a[i].y<<"), ";
cout<<"("<<a[i].x<<","<<a[i].y<<")"<<endl;
return 0;
}
第二题,倒序字符串,如读入一行I am a student输出student a am I
注意stringstream的用法
//吸取经验,变量尽量不要都是一个字母开头,容易弄混
#include<iostream>
#include<string>
#include<sstream>
#include<stack>
using namespace std;
int main()
{
string s,subs;
getline(cin,s);
stringstream ss(s);
stack <string> st;
while(ss>>subs)//符号不要用反,>>是输出到subs
st.push(subs);
while(!st.empty())
{
cout<<st.top()<<" ";
st.pop();
}
return 0;
}
第五题:
第七题 双队列 用map
系统A用来维护客户。每个客户的id用一个正整数K来表示,当客户进入系统时用P来表示此用户的优先度。这个系统有以下请求
0 | 系统停止运行 |
1 K P | 优先度为P的客户K进入系统 |
2 | 找到优先度最高的客户,然后此客户离开系统 |
3 | 找到优先度最低的客户,然后此客户离开系统 |
注意:不要题目说双队列就真的敲一个双队列出来啊。。。
//不知道对不对,因为oj上禁止提交了
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
typedef struct Client
{
int k,p;
Client(int x,int y)
{
k=x;p=y;
}
bool operator< (const Client &a) const
{
if (p==a.p)
return k<a.k;
else return p<a.p;
}
}Client;
int main()
{
map<Client,int> mp;
map<Client,int>::iterator it;
int opt,K,P;
while(cin>>opt)
{
if (opt==0)
break;
if (opt==1)
{
cin>>K>>P;
mp[Client(K,P)]++;
}
else if(opt==2)
{
if (mp.size()==0)
{
cout<<"0"<<endl;
continue;
}
it=mp.end();
it--;
cout<<it->first.k<<endl;
mp.erase(it);
}
else
{
if (mp.size()==0)
{
cout<<"0"<<endl;
continue;
}
it=mp.begin();
cout<<it->first.k<<endl;
mp.erase(it);
}
}
return 0;
}