CSDN竞赛第39期

参加了第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, 规定只能入手一次股票和抛售一次股票。 最大收益(含本金)是?

这题比赛的时候给的数据范围很小,O(n^2)都能过,所以就直接暴力了。        

不知道为啥不能格式化,只能手动格式化了,凑活着看吧

#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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值