【水题】 2017大数据研究中心夏令营上机考试 A 点排序 B 单词倒排 F双队列

点击打开链接

第一题,点倒排,按要求的顺序输出坐标

#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

系统停止运行

K P

优先度为P的客户K进入系统

2

找到优先度最高的客户,然后此客户离开系统

3

找到优先度最低的客户,然后此客户离开系统

输入每行包括一个请求,最后一行包括一个停止请求(代码0)。对于添加客户请求(代码1),优先度都是唯一的。客户的表示K小于10 6,优先度P小于10 7,一个客户可能会被添加多次,每次的优先度可能不同。输出对于每个请求2和3,程序必须输出一行。这行包括此请求中找到客户的id。如果系统中没有客户,输出0

注意:不要题目说双队列就真的敲一个双队列出来啊。。。

//不知道对不对,因为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值