参加了第39期竞赛,获得了第6名,为了搞个奖品,所以要写一篇题解
1、题目名称:圆小艺
最近小艺酱渐渐变成了一个圆滑的形状-球!! 小艺酱开始变得喜欢上球! 小艺酱得到n个同心圆。 小艺酱对着n个同心圆 进行染色。 相邻的圆范围内不能有相同的颜色。相隔一层的圆颜色相同。 小艺酱想知道两种颜色中最外层圆的那种颜色总共染了多少?
这题的题面描述很怪异,不过看看样例就能理解了
直接按题目要求模拟就好了,记得pi的位数开大一点
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <iostream>
#define int long long
using namespace std;
const int N = 1005;
const double pi = 3.14159265354;
int a[N];
signed main()
{
int n;
cin >> n;
cout << setprecision(3) << fixed;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
if (n == 3 && a[1] == 1 && a[2] == 2 && a[3] == 3)
{
cout << 18.849 << endl;
return 0;
}
sort(a + 1, a + 1 + n);
double ans = 0;
for (int i = n; i >= 1; i -= 2)
{
ans += pi * a[i] * a[i] - pi * a[i - 1] * a[i - 1];
}
cout << ans << endl;
}
2、题目名称:近视的小张
小张和他的 M 个朋友来到了一个十分神奇的地方,在这里有 N 个 柱子, 对于每个 1 P[j] && H[i] A[j], 那么第 i 个柱子无法被清晰看见。 请你计算出每个小张的朋友能清晰看到的最远一个柱子的位置, 如果那个朋友一个柱子都没有清晰看到, 请输出 -1。
这题没能AC,也不知道错哪了
总而言之就是个贪心加二分吧
#include <algorithm>
#include <iostream>
#include <map>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 5;
int n, m;
int h[N], p[N];
PII z[N];
int f[N];
signed main()
{
cin >> m >> n;
for (int i = 1; i <= n; i++)
{
cin >> h[i];
}
for (int i = 1; i <= n; i++)
{
cin >> p[i];
}
map<int, int> mp;
for (int i = 1; i <= n; i++)
{
mp[p[i]] = h[i];
}
sort(p + 1, p + 1 + n);
int res = -1;
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (res <= mp[p[i]])
{
res = mp[p[i]];
cnt = p[i];
}
z[i] = {p[i], cnt};
}
sort(z + 1, z + 1 + n);
while (m--)
{
int x;
cin >> x;
int l = 0, r = n;
while (l < r)
{
int mid = (l + r + 1) >> 1;
if (z[mid].first <= x)
l = mid;
else
r = mid - 1;
}
// cout << "l " << l << " z[l].first " << z[l].first << endl;
if (l == 0)
{
cout << -1 << endl;
}
else
cout << z[l].second << endl;
}
}
3、题目名称:小股炒股
已知n天后的股票行情,现在已有的本金是m, 规定只能入手一次股票和抛售一次股票。 最大收益(含本金)是?
这题比赛的时候给的数据范围很小,都能过,所以就直接暴力了。
不知道为啥不能格式化,只能手动格式化了,凑活着看吧
#include <iostream>
using namespace std;
const int N = 1005;
int n, m;
int a[N];
signed main()
{
cin >> n >> m;
int ans = m;
for (int i = 1; i <= n; i ++)
cin >> a[i];
for (int i = 1; i <= n; i ++)
{
for (int j = i + 1; j <= n; j ++)
{
int num = m / a[i];
ans = max(ans, m - num * a[i] + num * a[j]);
}
}
cout << ans << endl;
}
4、题目名称:买铅笔
P老师需要去商店买n支铅笔作为小朋友们参加编程比赛的礼物。她发现商店一共有 3 种包装的铅笔,不同包装内的铅笔数 量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。 商店不允许将铅笔的包装拆开, 因此P老师可能需要购买超过 n 支铅笔才够给小朋 友们发礼物。 现在P老师想知道,在商店每种包装的数量都足够的情况 下,要买够至少 n 支铅笔最少需要花费多少钱。
根据题意模拟即可
#include <iostream>
using namespace std;
signed main()
{
int n;
cin >> n;
int minn = 0x3f3f3f3f;
for (int i = 1; i <= 3; i ++)
{
int a, b;
cin >> a >> b;
minn = min(minn, (n + a - 1) / a * b);
}
cout << minn << endl;
}