2024 上海CCPC
The 2024 Shanghai Collegiate Programming Contest
补题连接:https://codeforces.com/gym/105229
M. 不共戴天
观察样例2,注意到6个荷叶两两分成一组,共分为3组
(1,2)(3,4)(5,6)
其中对于青蛙的策略是组内全部连接,即:
m = 3:1->2,3->4,5->6
鸟的策略是,相邻组相连,即:
m = 4:1->3,2->4,3->5,4->6
猜想均匀分组(每组荷叶数量相同)是最优解。
设共有
第
对于青蛙的总策略最大数
对于鸟的总策略最大数
考虑前
考虑第
当
最后按上面规律输出即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int fk = 0, ff = 0;
for(int k = 2; k < n; ++ k)
{
int t = (n + k - 1) / k; // t blocks
int l = (n % k == 0 ? k : n % k); // last block
int frog = (t - 1) * (k - 1) + (l - 1);
int bird = (t >= 2 ? (t - 2) * k : 0) + l;
if(bird >= frog) fk = k, ff = frog;
else break;
}
if(fk == 0)
{
cout << 0 << endl;
return 0;
}
cout << ff << endl;
// print
int t = (n + fk - 1) / fk;
int l = (n % fk == 0 ? fk : n % fk);
for(int i = 1; i <= t - 1; ++ i)
for(int j = 1; j < fk; ++ j)
{
int fir = (i - 1) * fk + j;
cout << fir << " " << fir + 1 << endl;
}
for(int j = 1; j < l; ++ j)
{
int fir = (t - 1) * fk + j;
cout << fir << " " << fir + 1 << endl;
}
int cnt = 1;
for(int i = 1; i <= t - 2 && cnt <= ff; ++ i)
for(int j = 1; j <= fk && cnt <= ff; ++ j, ++ cnt)
{
int fir = (i - 1) * fk + j;
cout << fir << " " << fir + fk << endl;
}
for(int j = 1; j <= l && cnt <= ff; ++ j, ++ cnt)
{
int fir = (t - 2) * fk + j;
cout << fir << " " << fir + fk << endl;
}
return 0;
}
E. 无线软件日
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
map<char,int> hash;
for(char hi : s)
{
if(hi == 's' || hi == 'S') hash['s']++;
if(hi == 'h' || hi == 'H') hash['h']++;
if(hi == 'a' || hi == 'A') hash['a']++;
if(hi == 'n' || hi == 'N') hash['n']++;
if(hi == 'g' || hi == 'G') hash['g']++;
if(hi == 'i' || hi == 'I') hash['i']++;
}
int cnt = 9999999;
for(auto hi : hash)
{
if(hi.first == 'h' || hi.first == 'a') cnt = min(cnt,hi.second/2);
else cnt = min(cnt,hi.second);
}
cout << (cnt == 9999999 ? 0 : cnt) << endl;
return 0;
}
J. 极简合数序列
前缀和暴力
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int arr[N], s[N];
inline bool is_heshu(int x)
{
if(x <= 2) return false;
for(int i = 2; i <= x / i; ++ i)
if(x % i == 0) return true;
return false;
}
void solve()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; ++ i)
{
scanf("%d",&arr[i]);
s[i] = s[i - 1] + arr[i];
}
for(int k = 1; k <= n; ++ k)
for(int i = 1; i <= n - k + 1; ++ i)
if(is_heshu(s[i + k - 1] - s[i - 1]))
{
printf("%d\n",k-1);
return;
}
printf("-1\n");
}
int main()
{
int t;
cin >> t;
while(t --){
solve();
}
return 0;
}
A. 无线网络整点栅格统计
观察时间复杂度,暴力即可
#include <iostream>
using namespace std;
const int N = 110;
int arr[N][N];
#define R register
inline void func(int ii, int jj, int k)
{
for(R int i = ii; i <= ii + k; ++ i)
++ arr[i][jj], ++ arr[i][jj + k];
for(R int j = jj; j <= jj + k; ++ j)
++ arr[ii][j], ++ arr[ii + k][j];
-- arr[ii][jj], -- arr[ii + k][jj], -- arr[ii][jj + k], -- arr[ii + k][jj + k];
}
int main()
{
int n, m;
cin >> n >> m;
for(R int k = 1; k <= min(n, m); ++ k)
{
for(int i = 0; i <= n - k; ++ i)
for(int j = 0; j <= m - k; ++ j)
func(i, j, k);
}
for(R int i = 0; i <= n; ++ i)
{
for(R int j = 0; j <= m; ++ j)
printf("%d ",arr[i][j]);
printf("\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现