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<iostream>
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<iostream>
#include<algorithm>
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<iostream>
#include<algorithm>
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 条直线将七巧板切分并且使得切出来的块最多,请问最多能有多少块?
Input
输入有多组(不超过 100, 000组)。
每组一行一个正整数 nn。
0 ≤ nn ≤ 1, 000, 000, 000
Output
每组输出一行一个数代表答案。
Sample Input
1
Sample Output
13
解题思路:这道题的规律就在于切中间的红色的方块,如右图所示其递增规律是第一次切成2块,第二次切成四块,第三次切成七块,第四次切成11块这样逐渐递增的,可推出七巧板的递增规律为初始为七块,第一次最多切六块出来,第二次切七块出来,依次递增。(因为之前的红色部分已经被切成两块了)规律为7+6+(6+1)+(6+2)…一直加下去。
AC代码如下:
#include<iostream>
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<iostream>
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;
}