Educational Codeforces Round 92 (Rated for Div. 2) A~C

原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处。

最近写学习了一下网络爬虫,但昨天晚上的CF让人感觉实力明显退步,又滚回来刷题了QAQ...

比赛链接:Here

1389A. LCM Problem

给定区间 [l,r],求两个不同的数字 x,y ,使得lx<yr,lLCM(x,y)r

思路

这道题和之前的一道求区间最大 gcd​​ 的签到很像,感兴趣的可以去看看 CF1370A. Maximum GCD

在这个题目中的条件可以整合为 lx<ylcmr,所以我们只需要让 lcm 最小即可 。

xy 的最小公倍数最小为 lcmmin(x,y)=y=2x ,此时令 x=l ,可以得到 lcmmin=y=2l ,即为最小的答案。如果 2l>r, 无解。

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int _; for (cin >> _; _--;) {
        ll l, r; cin >> l >> r;
        if (2 * l > r) cout << "-1 -1\n";
        else cout << l << " " << 2 * l << "\n";
    }
}

1389B. Array Walk

给定数组 a1,a2,a3,...,an,起点为 a1 ,你可以向左向右移动,不能越界,最多 k 次。

并且限制不能连续的向左移动,且向左移动的次数最多为 z

每次移动到位置 i 可以获取分数 ai ,初始分数为 a1 ,询问你可以得到的最大分数和。

思路:

最开始在写的时候挺懵逼的,但考虑差分之后感觉可以就往下推了,正好这个思路是正解?

首先,向左移动不能连续,所以如果有向左移动,就只能以左右间隔的形式反复横跳。其次,以贪心的思想,最大和出现的情况,一定是只在某两个相邻位置之间反复横跳。

我们将移动分为三个阶段:

  • 第一阶段,假设初始向右移动了 i 步,那么当前处于的位置为 ai+1 ,积分和为 s1=sumi+1 (设 sumi=k=1iak,即前 i 项和)
  • 第二阶段,随后在 ai​ 与 ai+1​之间反复横跳,设此过程中向左次数最多为 p​ 次,向右次数最多为 q​​ ,则 p=min(z,ki2),q=min(p,kip), 得到的积分为 s2=pai+qai+1​​
  • 第三阶段,设剩余的步数为 k1=kipq
    • 如果 k1>0 ,全部用于向右移动,可以得到的积分为 s3=sumk1+i+1sumi+1 (如果有剩余步,那 么第二阶段结束后位置一定在 i+1​) 。
    • 如果 k1=0, 则 s3=0, 且同时 i+1=kpq+1 ,即 sumi+1=sumkpq+1, 无论阶段二的落点是在 i 还是 i+1

三个阶段的总积分获取为:res=s1+s2+s3=sumkpq+1+pai+qai+1

则最大积分和 ans=max{resiresi=sumkpq+1+pai+qai+1,i[1,k]}​ ,

复杂度为:O(k)

const int N = 1e5 + 10;
ll a[N], s[N];
int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int _; for (cin >> _; _--;) {
        ll n, k, z;
        cin >> n >> k >> z;
        for (int i = 1; i <= n; ++i) cin >> a[i];
        ll ans = 0;
        s[0] = 0;
        for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i];
        for (int i = 1; i < k + 1; i += 1) {
            ll p = min(1ll * z, (k + 1 - i) / 2);
            ll q = min(1ll * p, k - i - p);
            ll res = s[k - p - q + 1] + p * a[i] + q * a[i + 1];
            ans = max(ans, res);
        }
        cout << ans << "\n";
    }
}

1389C. Good String

规定字符串 t1,t2,t3,...,tn

如果 tn,t1,t2,...tn3,tn2,tn1,tn​与 t2,t3,t4,...tn1,tn​ 完全相同,则称该字符串为 Good String

判断给定字符串至少删除多少个字符可以变成 Good String 。

思路:

简单推导可以得到 Good String 中:

  • 如果 n 是偶数,t1=t3=t5=...=tn3=tn1t2=t4=...=tn2=tn

    25252525

  • 如果 n 为奇数,t1=t2=...=tn ,如 2222

而且题目规定 ti[0,9] ,我们通过可以构造 10×10 种情况,分别算转化需要的最小花费。

复杂度为:O(102n)

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr);
    int _; for (cin >> _; _--;) {
        string s; cin >> s;
        int a[2] = {};
        int ans = INT_MAX;
        for (int i = 0; i < 10; ++i)
            for (int j = 0; j < 10; ++j) {
                a[0] = i, a[1] = j;
                int ct = 0, k = 0;
                for (int i = 0; i < s.size(); ++i) {
                    if (s[i] != a[k & 1] + '0') ct++;
                    else k = !k;
                }
                if (int(s.size() - ct) & 1) if (i != j) ct++; //只有全相等才能为奇数
                ans = min(ans, ct);
            }
        cout << ans << "\n";
    }
}

1389D. Segment Intersections

待补

posted @   RioTian  阅读(62)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
历史上的今天:
2020-09-22 第十次训练赛
2020-09-22 【计算几何 02】凸包问题(Convex Hull)
点击右上角即可分享
微信分享提示

📖目录