十天机试学习DAY1

1.排序

输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。
每组测试数据的结果占一行。

#include<iostream>
using namespace std;
int main()
{
	//输入
	int n,a[100];
	while (cin >> n)// 题目:可能有多组测试数据
	{
		for (int i = 0; i < n; i++)
		{
			cin >> a[i];
		}
		//冒泡排序
		for (int i = 0; i < n; i++)
		{
			for (int j = n - 1; j > i; j--)
			{
				if (a[j - 1] > a[j])
				{//交换
					int temp = a[j - 1];
					a[j - 1] = a[j];
					a[j] = temp;
				}
			}
		}
		//输出
		for (int i = 0; i < n; i++)
		{
			cout << a[i] << " ";
		}
		cout << endl;
	}
	return 0;
}

法2:调用c++库函数#include< algorithm >中的sort ( arr, arr+SIZE, compare ) 或 sort ( begin, end, compare )

sort(a, a + n);

注:sort()默认升序排列,如果要降序排列写为:

bool com(int a, int b)//自定义排序规则
{
	return a > b;//大于号为大者在前(降序),小于号相反
}
sort(a, a + n,com);

2.成绩排序

输入描述: 测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。————>结构体
输出描述: 将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。 然后输出学生信息,按照如下格式: 姓名 年龄 成绩

学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

//定义结构体
struct stu
{
	char name[20];
	int age;
	int score;
}buf[1000]; //创建结构体时将变量名放在结束括号的后面,即创建了一个结构体对象

//定义排序规则
bool com(stu a, stu b)
{
	int namecom = strcmp(a.name, b.name);//字符串比较用strcom
	if (a.score != b.score)//将学生信息按成绩进行排序
	{
		return a.score < b.score;//成绩升序
	}
	else if(namecom!=0)
	{
		return namecom<0;//成绩相同的则按姓名的字母序进行排序,字母小在前
	}
	else//名字也相同按照学生的年龄从小到大排序
	{
		return a.age < b.age;
	}
}

int main()
{
	//输入
	int n;
	while (cin >> n)
	{
		for (int i = 0; i < n; i++)
		{
			cin >> buf[i].name >> buf[i].age >> buf[i].score;
		}
		//排序
		sort(buf, buf + n,com);
		//输出
		for (int i = 0; i < n; i++)
		{
			cout << buf[i].name << " " << buf[i].age << " " << buf[i].score << endl;
		}
	}
	return 0;
}

3.特殊排序

题目描述:
输入一系列整数,将其中最大的数挑出,并将剩下的数进行排序。
输入:
输入第一行包括1个整数N,1<=N<=1000,代表输入数据的个数。
接下来的一行有N个整数。
输出:
可能有多组测试数据,对于每组数据,
第一行输出一个整数,代表N个整数中的最大值,并将此值从数组中去除,将剩下的数进行排序。
第二行将排序的结果输出。
样例输入:
4
1 3 4 2
样例输出:
4
1 2 3
提示:
如果数组中只有一个数,当第一行将其输出后,第二行请输出"-1"。

int main()
{
	int n = 0, a[1000];
	while (cin >> n)
	{
		//读入数据
		for (int i = 0; i < n; i++)
		{
			cin >> a[i];
		}
		//排序
		sort(a, a + n);
		//输出
		if (n == 1)
		{
			cout << a[0] << endl;
			cout << "-1" << endl;
		}
		else
		{
			cout << a[n - 1] << endl;
			for (int i = 0; i < n - 1; i++)
			{
				cout << a[i] <<" ";
			}
			cout << endl;
		}
	}
	return 0;
}

4.1752:鸡兔同笼

一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。
输入 n表示有n个数据输入,一个正整数a (a < 32768)。 输出
一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开。
如果没有满足要求的答案,则输出两个0,中间用一个空格分开。

int main()
{
	int a,min,max,n;
	cin >> n; 
	while (n--)
	{
	cin >> a;
	if (a % 4 == 0)
		cout << a/4 << " " << a/2 << endl;
	else if (a % 2 == 0)
		cout << a / 4+1 << " " << a / 2 << endl;
	else
		cout << "0 0"<< endl;
	}
	return 0;
}

5.校门外的树

描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。计算将这些树都移走后,马路上还有多少棵树。
输入
第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

int main()
{
	int sum = 0, a[10001] = { 0 };//注意马路长1 <= L <= 10000,树最多10001棵
	int begin, end, M = 0, L = 0;
	while (cin >> L >> M)//有多组输入数据,有时候显示Wrong Answer可能是没有这一句
	{
		//输入&标记
		for (int i = 0; i < M; i++)
		{
			cin >> begin >> end;
			for (int j = begin; j <= end; j++)//至多执行L次——>时间复杂度为O(M*L)
				a[j] = 1;
		}
		//统计
		for (int i = 0; i <= L; i++)
		{
			if (a[i] == 0)sum++;//时间复杂度为O(L)
		}
		cout << sum << endl;
	}
	return 0;
}//时间复杂度为O(M*L)+O(L)=O(M*L)

6.装箱问题

描述
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为11, 22, 33, 44, 55, 66。这些产品通常使用一个 66h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为11至66这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n, a, b, c, d, e, f, x, y;//n为箱子个数;
	//a, b, c, d, e, f为一个订单1*1至6*6这六种产品的数量
	//x:1*1空位数   y:2*2空位数   
	int u[4] = { 0, 5, 3, 1 };//当3*3箱子的个数为4k,4k+1,4k+2,4k+3时
	//可放下2*2箱子个数分别为0,5,3,1

	while (cin>>a>>b>>c>>d>>e>>f)
	{
		if (a == 0 && b == 0 && c == 0 && d == 0 && e == 0 && f == 0)
			break;//输入文件将以6个0组成的一行结尾
		//6*6、5*5、4*4有一个就多占一个箱子,3*3有4k个占k个箱子、4k+1、4k+2、4k+3个占k+1个箱子
		n = f + e + d + (c+3)/ 4 ;//新get:a/b向上取整=(a+b-1)/b
		y = 5 * d + u[c % 4];//有一个4*4出现5个2*2的空位
		if (b > y)
		{
			n += (b - y + 8) / 9;
		}
		x = 36 * n - b * 4 - c * 9 - d * 16 - e * 25 - f * 36;
		if (a > x)
		{
			n += (a - x + 35) / 36;
		}
		cout << n << endl;
	}
	return 0;
}
发布了16 篇原创文章 · 获赞 3 · 访问量 305

猜你喜欢

转载自blog.csdn.net/bajiaoyu517/article/details/103873103