目录
前言
比赛地址: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 < = N = 1000 , 1 < = A i < = 1 0 9 2<=N=1000,1<=A_i<=10^9 2<=N=1000,1<=Ai<=109
题解
显然是取最大的两个不同的数, A [ i ] < A [ j ] A[i]<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 < = T < = 1000 , ∑ N < = 1 0 6 1<=T<=1000,\sum N<=10^6 1<=T<=1000,∑N<=106
题解
从后往前遍历字符串,维护在字符串中最早出现的 X X X的下标 t t t,那么对于字符串中的每一个字符, S [ i ] S[i] S[i]到 S [ n − 1 ] S[n-1] S[n−1]这段字符串中,包含 X X X的子串数量即为 n − t n-t n−t
代码
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 N∗M大小的菜地,有 K K K个菜地格子里种了菜,它们的坐标为 ( r i , c i ) (r_i,c_i) (ri,ci),剩下的格子全部是杂草,让你用围栏把所有中了菜的格子围起来,求最小的围栏长度。
数据范围
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 1≤T≤10,1≤N,M≤109,1≤K≤105,1≤r≤N,1≤c≤M
题解
基于 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