洛谷排序题单题解(C++版)

目录

  • P1059
  • P2676
  • P1116
  • P1152
  • P1271
  • P1177
  • P1073
  • P1781
  • P1068
  • P1104
  • P1012
  • P1923
  • P5143

P1059

  • P1059 [NOIP2006 普及组] 明明的随机数
#include
#include
using namespace std;
int a[1000];
int N;
int main(){
	cin>>N;
	for (int i = 0; i < N; ++i)
	{
		cin>>a[i];
	}
	sort(a,a+N);
	int n = unique(a,a+N) - a;
	cout<<n<<endl;
	for (int i = 0; i < n; ++i)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

P2676

  • P2676 [USACO07DEC]Bookshelf B
#include 
#include 
#include 
using namespace std;
int main(){
	int N;
	long long B;
	cin>>N>>B;
	vector<int> v(N);
	for (int i = 0; i < N; ++i)
	{
		cin>>v[i];
	}
	sort(v.begin(),v.end());
	reverse(v.begin(),v.end());
	int least = 0, i = 1;
	while(i <= N){
		long long sum = 0;
		for (int j = 0; j < i; ++j)
		{
			sum += v[j];
		}
		if (sum >= B)
		{
			least = i;
			break;
		}
		i++;
	}
	cout<<least<<endl;
	return 0;
}

P1116

  • P1116 车厢重组
#include 
#include 
#include 
using namespace std;
void swap(int &a,int &b){
	int temp = a;
	a = b;
	b = temp;
}
int main(int argc, char const *argv[])
{
	int N;
	cin>>N;
	int count = 0;
	vector<int> v(N);
	for (int i = 0; i < N; ++i)
	{
		cin>>v[i];
	}
	for (int i = 0; i < N - 1; ++i)
	{
		for (int j = 0; j < N - i - 1; ++j)
		{
			if (v[j] > v[j + 1])
			{
				swap(v[j],v[j + 1]);
				count++;
			}
		}
	}
	cout<<count<<endl;
	return 0;
}

P1152

  • P1152 欢乐的跳
#include 
#include 
#include 
#include 
using namespace std;
int main(int argc, char const *argv[])
{
	int n;
	cin>>n;
	vector<long long> v(n);
	set<long long> s;
	for (int i = 0; i < n; ++i)
	{
		cin>>v[i];
	}
	for (int i = 0; i < n - 1; ++i)
	{
		int ans = abs(v[i] - v[i + 1]);
		if (ans >= 1 && ans <= n - 1)
		{
			if (!s.insert(ans).second)
			{
				cout<<"Not jolly";
				return 0;
			}
		}
		else
		{
			cout<<"Not jolly"<<endl;
			return 0;
		}
	}
	cout<<"Jolly"<<endl;
	return 0;
}

P1271

  • P1271 【深基9.例1】选举学生会
#include 
#include 
#include 
using namespace std;

int main(){
	int m,n;
	cin>>n>>m;
	vector<int> a(m);
	for (int i = 0; i < m; ++i)
	{
		cin>>a[i];
	}
	sort(a.begin(),a.end());
	for (int i = 0; i < m; ++i)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

P1177

  • P1177 【模板】快速排序
#include 
#include 
#include 
using namespace std;
int main(int argc, char const *argv[])
{
	int n;
	cin>>n;
	vector<int> v(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>v[i];
	}
	sort(v.begin(),v.end());
	for (int i = 0; i < n; ++i)
	{
		cout<<v[i]<<" ";
	}
	return 0;
}

题目直接用sort()结束了,但是快速排序的方法一定要学习,网络上有很多讲解快速排序的,这里放一段java代码

private void quickSort(int[] nums,int l,int r) {
		if(l < r) {
			int i = l,j = r, x = nums[l];
			while(i < j) {
				while(i < j && nums[j] >= x) {
					j --;
				}
				if(i < j) {
					nums[i] = nums[j];
				}
				while(i < j && nums[i] < x) {
					i ++;
				}
				if(i < j) {
					nums[j] = nums[i];
				}
			}
			nums[i] = x;
			quickSort(nums,l,i-1);
			quickSort(nums,i+1,r);
		}

P1073

  • P1093 [NOIP2007 普及组] 奖学金
#include
#include

using namespace std;

bool cmp(int* a,int* b)
{
	if(a[0] != b[0]) return a[0] > b[0];//按第一列即总成绩降序排列
	if(a[1] != b[1]) return a[1] > b[1];//按第二列即语文成绩降序排列
	return a[4] < b[4];//最后按学号升序排列
}

int main(){
	int n;
	cin>>n;
	int** a = new int*[n];
	for (int i = 0; i < n; ++i)
	{
		a[i] = new int[5];
		a[i][0] = 0;
		for (int j = 1; j <= 3; ++j)
		{
			cin>>a[i][j];
			a[i][0] += a[i][j];
		}
		a[i][4] = i + 1;
	}
	sort(a,a + n,cmp);
	for (int i = 0; i < 5; ++i)
	{
		cout<<a[i][4]<<" "<<a[i][0]<<endl;
	}
	return 0;
}

P1781

  • P1781 宇宙总统
#include 
#include 
using namespace std;
/**
*string的比较 保存数字的字符串=高精度版比较大小
*/
int main(){
	int n,id;
	string max = "";
	string in;
	cin>>n;
	for (int i = 0; i < n; ++i)
	{
		cin>>in;
		int inSize = in.size();
		int maxSize = max.size();
		if (inSize > maxSize || (inSize == maxSize && in > max))
		{
			max = in;
			id = i + 1;
		}
	}
	cout<<id<<endl<<max<<endl;
	return 0;
}

P1068

  • P1068 [NOIP2009 普及组] 分数线划定
#include 
#include 
#include 
using namespace std;
//按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
bool cmp(vector<int> a,vector<int> b){
	if (a[1]!=b[1])
	{
		return a[1] > b[1];
	}
	else{
		return a[0] < b[0];
	}
}
int main(int argc, char const *argv[])
{
	int n,m;//n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数
	cin>>n>>m;
	int count = m * 3 / 2;//count表示入选人数 考虑同分情况 初始count位置不一定是真正入选人数 需要调整
	vector< vector<int> > v(n,vector<int>(2));
	//第一列报名号 第二列表示笔试成绩
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < 2; ++j)
		{
			cin>>v[i][j];
		}
	}
	//按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
	sort(v.begin(),v.end(),cmp);
	//分数线由定义是count = m * 3 / 2对应分数
	int scoreLine = v[count - 1][1];
	//寻找顺次第一个小于分数线的人即可计算出入选人数
	for (int i = 0; i < n; ++i)
	{
		if (v[i][1] < scoreLine)
		{
			count = i;
			break;
		}
	}
	cout<<scoreLine<<" "<<count<<endl;
	for (int i = 0; i < count; ++i)
	{
		cout<<v[i][0]<<" "<<v[i][1]<<endl;
	}

	return 0;
}

P1104

  • P1104 生日
#include 
#include 
#include 
#include 
using namespace std;
struct Person
{
	int number;//输入次序
	string name;
	int year;
	int month;
	int day;
};
bool cmp(Person p1,Person p2){
	if (p1.year != p2.year)
	{
		return p1.year < p2.year;
	}else{
		if (p1.month != p2.month)
		{
			return p1.month < p2.month;
		}else{
			if (p1.day != p2.day)
			{
				return p1.day < p2.day;
			}else{
				return p1.number > p2.number;
			}
		}
	}
}
int main(int argc, char const *argv[])
{
	int n;
	cin >> n;
	vector<Person> v(n);
	for (int i = 0; i < n; ++i)
	{
		v[i].number = i + 1;
		cin>>v[i].name;
		cin>>v[i].year;
		cin>>v[i].month;
		cin>>v[i].day;
	}
	sort(v.begin(),v.end(),cmp);
	for (int i = 0; i < n; ++i)
	{
		cout<<v[i].name<<endl;
	}

	return 0;
}

P1012

  • P1012 [NOIP1998 提高组] 拼数
#include 
#include 
#include 
#include 
using namespace std;
//自定义排序函数,这一步非常巧妙,假设a=321,b=32;a+b=32132,b+a=32321这样下面sort排下来就是32>321避免出现32132>32321的情况 
/*如果这样写:
bool cmp(string a,string b){
    return a>b;
    会发生321>32的情况进而会有32132>32321,具体原因是字符串自己的关系运算是这样设定的 
}*/

bool cmp(string a, string b){
	return (a + b) > (b + a);
} 
int main(int argc, char const *argv[])
{
	int n;
	cin >> n;
	vector<string> v(n);
	for (int i = 0; i < n; ++i)
	{
		cin>>v[i];
	}
	sort(v.begin(),v.end(),cmp);
	string s = "";
	for (int i = 0; i < n; ++i)
	{
		s += v[i];
	}
	cout<<s<<endl;
	return 0;
}

P1923

  • P1923 【深基9.例4】求第 k 小的数
#include
using namespace std;
long long n,k,a[5000010];
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    nth_element(a,a+k,a+n);//使第k小整数就位 
    printf("%d",a[k]);//调用第k小整数
}

P5143

  • P5143 攀爬者
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
bool cmp(vector<int> a,vector<int> b){
	return a[2] < b[2];
}
int main(int argc, char const *argv[])
{
	int n;
	cin>>n;
	vector< vector<int> > v(n,vector<int>(3));
	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < 3; ++j)
		{
			cin>>v[i][j];
		}
	}
	sort(v.begin(),v.end(),cmp);
	double distance= 0.0;
	for (int i = 0; i < n - 1; ++i)
	{
		distance += sqrt(pow(v[i][0] - v[i + 1][0],2) + pow(v[i][1] - v[i + 1][1],2) + pow(v[i][2] - v[i + 1][2],2));
	}
	/*
	setprecision是指设置输出精度,当没有
	cout<
	cout<<fixed<<setprecision(3)<<distance<<endl;
	return 0;
}

你可能感兴趣的:(洛谷,算法,排序)