2019中国大学生程序设计竞赛-女生专场(重现赛)

A - Ticket

北京地铁票每月的打折规则为:本次乘车前总消费不足 100 元本次不打折,满 100 元不足 150 元本次打8 折,满 150 元不足 400 元本次打 5 折,已满 400 元后本次不打折,已知 wls 每次出行的原票价,请问实际的花费是多少?
Input
输入包含两行。第一行一个整数 n 代表 wls 将要出行的次数。第二行 n 个正整数, ai 代表每次出行的票的原价,wls 是按照输入顺序依次出行的。
0 ≤ n ≤ 1, 000
0 < ai ≤ 1, 000
Output
一行一个数,代表实际的花费,保留小数点后两位小数。
Sample Input
3
100 20 20
Sample Output
132.00

题目分析首先根据题意可知第一次买票是肯定不会打折的,所以就应该从第二次开始判断打折之后的价格和,一直判断到最后。

AC代码如下:

#include
using namespace std;
const int maxn = 1005;
double a[maxn];
int main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{		
		cin >> a[i];
	}
	double sum =a[0];
	for (int i = 1; i < n; i++)
		{
		if (sum >= 100 && sum <= 150)
		{	
			sum += a[i] * 0.8;
		}
		if (sum >= 150 && sum <400)
		{
			sum += a[i] * 0.5;
		}
		if (sum < 100 || sum >= 400)
		{
			sum += a[i];
		}
	}
	printf("%.2f\n", sum);
	return 0;
}

B - Gcd

wls 有一个整数 nn,他想将 1 −n 这 n 个数字分成两组,每一组至少有一个数,并且使得两组数字的和的最大公约数最大,请输出最大的最大公约数。
Input
输入一行一个整数 nn。
2 ≤ n≤ 1, 000, 000, 000
Output
输出一行一个整数表示答案。
Sample Input
6
Sample Output
7

题目分析:本题是要求将1到n的和分成两部分并且要求他们的最大公约数最大,我们可以将1到n的和从最开始的对半分开始,依次分下去,如果余数为零的话,则直接用当前数去整除它,所得数即为最大的最大公约数。

AC代码如下:

#include
#include
using namespace std;
int main()
{
	long long n;
	long long sum1=0;
	long long sum2=0;
	cin >> n;
	long long sum = n*(n+1) / 2;
//	cout << sum << endl;
	long long len;

	for (int i = 2; i <= n; i++)
	{
		if (sum%i==0)
		{
			len = sum/i;
			break;
		}
	}
	
	cout <<len<< endl;

	return 0;
}

G - Circle

在半径为 1 的圆上有 n 个点,它们也是圆的 n等分点,将每个相邻的 n 等分点相连,组成了一个正 n边形,现在你可以在圆上再增加一个点,使得新的 n + 1 边形的面积最大,请输出最大面积。
Input
输入有多组(不超过 100 组)。
每组数据一行一个整数 nn 代表点的数量。
3 ≤ n ≤ 100
Output
每组数据输出一行一个数表示加上一个点后的最大面积,结果保留6位小数。
Sample Input
3
Sample Output
1.732051

本题就是简单的一个sin,cos的应用,把n个等分点分成n个三角形,增加的点就是在圆上的两个顶点的中间。

#include
#include
using namespace std;
#define PI acos(-1)

int main()
{
	
	int  n;
	while (cin >> n)
	{
		double r = 1;
		double ans, x;
		ans = (n - 1)*(r*r*sin((180.0 / n)*(PI / 180.0))*cos((180.0 / n)*(PI / 180.0))) + r*r*sin((180.0 / n)*(PI / 180.0));//度数乘以pi/180

		printf("%.6f\n", ans);

	}
	return 0;
}

J - Tangram :

一块七巧板有 7 块,现在 wls 想再在七巧板上加 nn 条直线将七巧板切分并且使得切出来的块最多,请问最多能有多少块?
2019中国大学生程序设计竞赛-女生专场(重现赛)_第1张图片
Input
输入有多组(不超过 100, 000组)。
每组一行一个正整数 nn。
0 ≤ nn ≤ 1, 000, 000, 000
Output
每组输出一行一个数代表答案。
Sample Input
1
Sample Output
13

2019中国大学生程序设计竞赛-女生专场(重现赛)_第2张图片

解题思路:这道题的规律就在于切中间的红色的方块,如右图所示其递增规律是第一次切成2块,第二次切成四块,第三次切成七块,第四次切成11块这样逐渐递增的,可推出七巧板的递增规律为初始为七块,第一次最多切六块出来,第二次切七块出来,依次递增。(因为之前的红色部分已经被切成两块了)规律为7+6+(6+1)+(6+2)…一直加下去。

AC代码如下:

#include
using namespace std;

int main()
{
	long long n;
	while (cin >> n)
	{
		cout <<7+(11+n)*(n)/2<< endl;

	}

	return 0;
}

K - Tetris

wls 有一个 n ; m 的网格,他现在想用俄罗斯方块中的"凸"型密铺它。


在这里插入图片描述

一个"凸"型占四个格子,你可以随意把它调成上下左右四个方向中的一个。
密铺的定义是网格中任意一个格子被且只被一个"凸"型铺到,并且这些"凸"型不能铺出网格的边界。
随意输出一组解即可。

Input
一行两个整数 n, m。
1 ≤ n, m ≤ 12
Output
无解输出 no response。
如果有解,输出 n 行,每行 m 个字符。你只能使用 1, 2, 3, 4 这四个字符,由同 一字符组成的四连通块被视为一个"凸"型。
如果有多组解,那么输出任意一种即可。
Sample Input
4 4
Sample Output
1113
2133
2243
2444

本题思路:本题是个特判题,就是当n和m都能整除四的时候才能将“凸”完全铺完,直接将4X4数组填入即可。

AC代码如下:

#include
using namespace std;
const int maxn = 15;
int a[4][4] = { { 1, 1, 1, 3 }, { 2, 1, 3, 3 }, { 2, 2, 4, 3 }, { 2, 4, 4, 4 } };
int main()
{
	int n, m;
	while (cin >> n >> m)
		{
		if (n % 4 != 0 || m % 4 != 0)
		{
			cout << "no response" << endl;
			continue;
		}
			for (int i = 0; i < n; i++)
			{
				for (int j = 0; j < m; j++)
				{
					cout << a[i % 4][j % 4];
				}
				cout << endl;
			}
	}
	return 0;
}

后续待补充。。。

你可能感兴趣的:(算法块)