2022-04-19 CFS ROUDN 783 水题记录

这里是平时水水比赛的流水账式思路记录,如果有值得研究的题则会另写详细题解。
我的个人博客页面(原文链接)

  前面陆陆续续打了二十来场都没写点水题记录,今天来一篇。

Problem A - Direction Change

  找规律题,到达边后左右或者上下跳动即可,注意不能超过起点终点围成的矩形范围。

void solveAA()
{
    int n, m;
    cin >> n >> m;
    if (n == 1 && m == 1)
    {
        cout << 0 << endl;
    }
    else if (m == 1)
    {
        if (n == 2)
        {
            cout << 1 << endl;
        }
        else
        {
            cout << "-1" << endl;
        }
    }
    else if (n == 1)
    {
        if (m == 2)
        {
            cout << 1 << endl;
        }
        else
        {
            cout << "-1" << endl;
        }
    }
    else
    {
        if (n > m)
        {
            swap(n, m);
        }
        int dis = m - n;
        int ans = m + n - 2;
        ans += dis / 2 * 2;

        cout << ans << endl;
    }
}
void solveA()
{
    int t;
    cin >> t;
    while (t--)
    {
        solveAA();
    }
}

Problem B - Social Distance

  这道题比A简单,直接贪心遍历一遍,然后最后一个人要考虑与第一个人在环上的距离即可。

// B
void solveBB()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int flag = 1;
    int pre = 0;
    for (int i = 0; i < n; i++)
    {
        pre = pre + a[i] + 1;
        if (pre > m)
        {
            flag = 0;
            break;
        }
        if (i == n - 1)
        {
            if (m - pre + a[0] < a[i])
            {
                flag = 0;
            }
        }
    }
    cout << (flag ? "YES" : "NO") << endl;
}
void solveB()
{
    int t;
    cin >> t;
    while (t--)
    {
        solveBB();
    }
}

Problem C - Make it Increasing

  二分贪心想了半天,后来一看数据量5e3,明显是个 O ( N 2 ) O(N^2) O(N2)的暴力算法,由于每一次最多只能选定一点为0,并且选一个0比都不选来的更优,所以可以先遍历每一个点设为0,左右再开遍历简单贪心即可。

  思路想的很快,但是实现的时候忘记开ll了,答案和数组都要ll,今晚寝室有点吵,打到这就已经睡觉时间了,遂结束。(吃个教训,数据范围切勿盲目自信)

// C
void solveC()
{
    int n;
    cin >> n;
    vector<ll> a(n), dis(n);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    ll minn = 0;
    for (int i = 0; i < n; i++)
    {
        vector<ll>b = a;
        b[i] = 0;
        ll cnt =0;
        for(int j=i-1;j>=0;j--){
            cnt+=(b[j+1]/b[j]+1);
            b[j] = b[j]*(b[j+1]/b[j]+1);
        }
        for(int j=i+1;j<n;j++){
            cnt+=(b[j-1]/b[j]+1);

            b[j] = b[j]*(b[j-1]/b[j]+1);
        }
        if(minn == 0){
            minn = cnt;
        }
        minn = min(minn,cnt);
    }
    cout<<minn<<endl;
}

。。。考研时间仅当娱乐,不补了。


参考代码:

/*
 * @Author: Retr0.Wu
 * @Date: 2022-04-19 22:17:14
 * @Last Modified by: Retr0.Wu
 * @Last Modified time: 2022-04-19 23:58:07
 */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
// A
void solveAA()
{
    int n, m;
    cin >> n >> m;
    if (n == 1 && m == 1)
    {
        cout << 0 << endl;
    }
    else if (m == 1)
    {
        if (n == 2)
        {
            cout << 1 << endl;
        }
        else
        {
            cout << "-1" << endl;
        }
    }
    else if (n == 1)
    {
        if (m == 2)
        {
            cout << 1 << endl;
        }
        else
        {
            cout << "-1" << endl;
        }
    }
    else
    {
        if (n > m)
        {
            swap(n, m);
        }
        int dis = m - n;
        int ans = m + n - 2;
        ans += dis / 2 * 2;

        cout << ans << endl;
    }
}
void solveA()
{
    int t;
    cin >> t;
    while (t--)
    {
        solveAA();
    }
}
// B
void solveBB()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int flag = 1;
    int pre = 0;
    for (int i = 0; i < n; i++)
    {
        pre = pre + a[i] + 1;
        if (pre > m)
        {
            flag = 0;
            break;
        }
        if (i == n - 1)
        {
            if (m - pre + a[0] < a[i])
            {
                flag = 0;
            }
        }
    }
    cout << (flag ? "YES" : "NO") << endl;
}
void solveB()
{
    int t;
    cin >> t;
    while (t--)
    {
        solveBB();
    }
}
// C
void solveC()
{
    int n;
    cin >> n;
    vector<ll> a(n), dis(n);
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    ll minn = 0;
    for (int i = 0; i < n; i++)
    {
        vector<ll> b = a;
        b[i] = 0;
        ll cnt = 0;
        for (int j = i - 1; j >= 0; j--)
        {
            cnt += (b[j + 1] / b[j] + 1);
            b[j] = b[j] * (b[j + 1] / b[j] + 1);
        }
        for (int j = i + 1; j < n; j++)
        {
            cnt += (b[j - 1] / b[j] + 1);

            b[j] = b[j] * (b[j - 1] / b[j] + 1);
        }
        if (minn == 0)
        {
            minn = cnt;
        }
        minn = min(minn, cnt);
    }
    cout << minn << endl;
}
int main()
{
    solveC();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值