2022.4.20

Codeforces Round #783 (Div. 2)

最近思维很差劲,一开始想错了思路后面就一直卡着想着调就很难回到正轨了,越急越寄。

A - Direction Change

是个找规律题,可以把每个数拆成两部分,如(7,4)可以分成先走(4,4),再走到(7,4)。走到(4.4)所需步数为2*(n-1),剩下步数需要根据m-n的奇偶性来确定,如果是偶数就需要多走一步。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,INF=1e9; 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n, m;
        cin >> n >> m ;
        ll ans = 0;
        if(n>m)
            swap(n, m);
        if(n==1)
        {
            if(m>2)cout << "-1\n";
            else
                cout << m - 1 << '\n';
        }
        else
        {
            ans = 2 * (n -1)  + (m - n) * 2;
            if(m-n&1)
                ans--;
            cout << ans << '\n';
        }
    }

    return 0;
}

B - Social Distance

又想错了思路,想着把首位相连变成字符串一样去处理。结果当然错了,实际上是贪心。对于输入的椅子间隔从小到大排序,间隔最大的可以用来放间隔第二大和第三大的,会把他们包含进去,直到最后的a[1],因此答案就是n+a[2]+...+a[n]+a[n]。加两遍a[n]是因为a[n]左右都可以用来放。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1e5+10,INF=1e9;
int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin >> n >> m;
        for (int i = 1; i <= n ;i++)
        {
            cin >> a[i];
        }
        sort(a + 1, a + 1 + n);
        ll ans = n+a[n];
        for (int i = 2; i <= n;i++)
        {
            ans += a[i];
        }
        if(ans>m)
            cout << "no\n";
        else
            cout << "yes\n";
    }

    return 0;

C. Make it Increasing

可以发现答案中总有一个数是没有改变的,即为0,时限有2sn为5000我们可以考虑直接暴力枚举哪一位是不操作,为了严格递增,这个数后面第一个数至少为1,第二个数至少为2...,小于这个数的数同理,因此我们可以把满足要求的需要的次数记下来每次遍历取最小值。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=5e3+10,INF=1e9;
ll a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for (int i = 1; i <= n;i++)
        cin >> a[i];
    ll ans = 1e18;
    for (int i = 1; i <= n;i++)
    {
        ll res = 0,cnt = 0;
        for (int j = i-1; j >=1 ; j--)
        {
            ll tot = ceil((res-1)*1.0 / -a[j]);
            cnt += tot;
            res = tot * -a[j];
        }
        res = 0;
        for (int j = i+1; j <=n ; j++)
        {
            ll tot = ceil((res+1)*1.0 / a[j]);
            cnt += tot;
            res = tot * a[j];
        }
        ans = min(ans, cnt);
    }
    cout << ans;
    return 0;
}

posted @ 2022-04-20 23:07  menitrust  阅读(16)  评论(0编辑  收藏  举报