8.30日学习总结

        我发现自己总是浮于表面,没办法认认真真的研究或者是学习某一件事情,因此,从今天开始,我会每天晚上写一篇总结,总结今天做了什么,可能是算法,论文,或者是生活上的琐事。

        浙江省赛,自己看法,A-C, L,晚上会补I,G,还有完全背包,cf的e题。

        Problem - A - Codeforces

题意:给你两个整数a,b,每一步只能加正奇数x或减正偶数y,多少步,可以让a变成b?

解析:如果a==b,则答案为0

        如果a > b,那么a->b,必须得减数字。如果相差为偶数的话,1步即可。如果相差为奇数的话,先减2(a - b) ,再加(a - b),这样刚好是2步。

        如果a<b,那么a->b,必须加数字。如果相差为奇数的话,1步即可。如果相差为偶数的话,需要分情况,6/2=3,4/2=2,  如果(b-a)/2,为奇数的话,两步即可。如果为偶数的话,还需要减一个偶数。

void solve()
{
    int a, b; cin >> a >> b;
    if (a == b) cout << 0 << endl;
    else if (a < b)
    {
        if ((b - a) % 2) cout << 1 << endl;
        else
        {
            if ((b - a) / 2 % 2 == 1) cout << 2 << endl;
            else cout << 3 << endl;

        }
    }
    else
    {
        if ((a - b) % 2 == 0) cout << 1 << endl;
        else cout << 2 << endl;
    }
}

```

B签到题。

Problem - C - Codeforces

题意:序列a,b,长度分别为n,m,在a中找大于等于x的个数,在b中找小于等于x的个数。

解析:可以直接暴力枚举,也可以二分,但是需要注意边界情况。还需要特判pos是否==x

        如果找不到的话,就是在n+1或者在1位置上。

void solve()
{
    int n, m, x; cin >> n >> m >> x;
    vector<int>a(n + 1), b(m + 1);
    for (int i = 1; i <= n; i++) cin >> a[i];    
    for (int i = 1; i <= m; i++) cin >> b[i];

    sort(a.begin() + 1, a.end());
    sort(b.begin() + 1, b.end());

    int res = 0;

    int posa = lower_bound(a.begin() + 1, a.end(), x) - a.begin();
    res += max((n - posa), 0);
    if (a[posa] >= x) res++;

    int posb = upper_bound(b.begin() + 1, b.end(), x) - b.begin();
    posb--;
    res += posb;
    cout << res << endl;
}

        Problem - L - Codeforces

题意:给定一个序列,在子序列里面找大于子序列平均值的最大数量。

题解:数字越小,平均值越小。因为小数字会拉低平均值,比如1 50 100,和40 50 100,我们倾向于选择小数字。因为我们从小到大枚举数字,算出平均值,再求出最大的个数。

void solve()
{
    int n; cin >> n;
    vector<int>a(n + 1);

    for (int i = 1; i <= n; i++) cin >> a[i];

    sort(a.begin() + 1, a.end());

    int sum = 0;
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
    sum += a[i];

    int l = upper_bound(a.begin() + 1, a.begin() + i, sum / i) - a.begin();
    ans = max(ans, i - l + 1);
    }
    cout << ans << endl;
}

Codeforces Round #817 (Div. 4)的D题。

Problem - D - Codeforces

题意:一段序列,由L,R组成,各自朝向的个数,我们可以更改k个人的朝向,求朝向人数的最大值为多少?

解析:坐标从0开始,L的贡献值为i,R的贡献值为n-i-1,我们从中间分开,0->mid都是R,mid->n-1都为L,我们可以算出改变人的贡献值,排序,相加即可。

void solve()
{
    int k; cin >> k;
    string s; cin >> s;

    int n = s.length();

    int sum = 0;

    for (int i = 0; i < n; i++)
    {
    if (s[i] == 'R') sum += (n - i - 1);
    else sum += i;
    }


    int mid = n / 2 - 1;

    vector<int>sub;

    for (int i = 0; i <= mid; i++)
    {
        if (s[i] == 'R') sub.push_back(0);
        else sub.push_back((n - i - 1) - i);
    }
    for (int i = n - 1; i > mid; i--)
    {
        if (s[i] == 'L') sub.push_back(0);
        else sub.push_back(i - (n - i - 1));
    }
    sort(sub.begin(), sub.end(), greater<int>());

    for (int i = 0; i < k; i++)
    {
        if (i >= n)
        {
            cout << sum << " ";
            continue;
        }
        sum += sub[i];
        cout << sum << " ";
        cout << endl;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值