CodeChef April Challenge 2019 Division 2

本文是关于2019年4月CodeChef算法竞赛Div. 2部分的题解,包括Maximum Remaining、Friend or Girlfriend、Fencing等7道题目。文章详细介绍了每道题目的题意、数据范围、解题思路和代码实现。适合编程爱好者学习和交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

比赛地址:https://www.codechef.com/APRIL19B
CodeChef是世界著名的算法竟赛网站,而它每个月的举办的long challenge contest以有偿付费出题的高质量而闻名。比赛为期十天,期间要独立解决8个左右的由易到难的算法编程题目,严禁作弊行为。比赛分为div1和div2,前者的难度很大,参加的要求是rating>=1800,通常参加人数不超过千人,后者的难度较之相对容易,参加人数通过超过一万,但是两者会有一些问题是公共的。比赛结束后,所有代码公开,任何人都可以查看和学习,同时讨论区也会发布详细的英文题解。
这篇题解仅包括div2的七道题目,除去最后一道特殊的交互题。

因为我知识水平有限,如有错误或者纰漏,还望指出,如有疑问,也欢迎交流。
QQ:1434287907


Maximum Remaining

题意

给你一个大小为 N N N的序列 A A A,求 m a x ( A i max(A_i max(Ai% A j ) A_j) Aj)

数据范围

2 &lt; = N = 1000 , 1 &lt; = A i &lt; = 1 0 9 2&lt;=N=1000,1&lt;=A_i&lt;=10^9 2<=N=1000,1<=Ai<=109

题解

显然是取最大的两个不同的数, A [ i ] &lt; A [ j ] A[i]&lt;A[j] A[i]<A[j],答案就是 A [ i ] A[i] A[i]% A [ j ] A[j] A[j]
值得注意的是,当所有数相同时,答案为 0 0 0

代码

int main()
{
   
   
    int n;
    cin>>n;
    vector<int> a(n);
    for(int i=0; i<n; i++) cin>>a[i];
    sort(a.rbegin(),a.rend());
    for(int i=1; i<n; i++)
        if(a[i]!=a[i-1]) return cout<<a[i],0;
    cout<<0;
    return 0;
}

Friend or Girlfriend

题意

给你一个长度为 N N N的字符串 S S S和一个字符 X X X,求有多少个包含 X X X的不同子串

数据范围

1 &lt; = T &lt; = 1000 , ∑ N &lt; = 1 0 6 1&lt;=T&lt;=1000,\sum N&lt;=10^6 1<=T<=1000N<=106

题解

从后往前遍历字符串,维护在字符串中最早出现的 X X X的下标 t t t,那么对于字符串中的每一个字符, S [ i ] S[i] S[i] S [ n − 1 ] S[n-1] S[n1]这段字符串中,包含 X X X的子串数量即为 n − t n-t nt

代码

int main()
{
   
   
    int T;
    cin>>T;
    while(T--)
    {
   
   
        cin>>n;
        cin>>s>>c;
        ll ans=0;
        for(int i=n-1,t=-1; ~i; i--)
        {
   
   
            if(s[i]==c) t=i;
            if(~t) ans+=n-t;
        }
        cout<<ans<<endl;
    }
    return 0;
}

Fencing

题意

给以一个 N ∗ M N*M NM大小的菜地,有 K K K个菜地格子里种了菜,它们的坐标为 ( r i , c i ) (r_i,c_i) (rici),剩下的格子全部是杂草,让你用围栏把所有中了菜的格子围起来,求最小的围栏长度。

数据范围

1 ≤ T ≤ 10 , 1 ≤ N , M ≤ 1 0 9 , 1 ≤ K ≤ 1 0 5 , 1 ≤ r ≤ N , 1 ≤ c ≤ M 1≤T≤10,1≤N,M≤10^9,1≤K≤10^5,1≤r≤N,1≤c≤M 1T10,1N,M109,1K105,1rN,1cM

题解

基于 m a p map map D F S DFS DFS

代码

#include<bits/stdc++.h>
using namespace std;

#define fi first
#define se second

typedef long long ll;
typedef pair<int,int> pi;
typedef vector<pi> vpi;

const int N=1000007;

int n,m,k,ans;
map<pi,bool> f,vis;

void dfs(pi t)
{
   
   
    vis[t]=1;
    if(!f[{
   
   t.fi+1,t.se}]) ans++;
    else if(!vis[{
   
   t.fi+1,t.se}]) dfs({
   
   t.fi+1,t.se});
    if(!f[{
   
   t.fi-1,t
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值