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

猜想均匀分组(每组荷叶数量相同)是最优解。
设共有 n 个荷叶,每组包含 k 个荷叶,则共分为 t=n/k
i 组包含的树叶个数 f(i)

f(i)={k,i ≤ t-1nMODk==0?k:nMODk,i = t

对于青蛙的总策略最大数 mf=i=1tf(i)1
对于鸟的总策略最大数 mb
考虑前 t1

mb={i=1t2f(i)=(t2)k,t ≥ 20,t ≤ 1

考虑第 tmb=f(t)

k 增加时,mbmf,因此从小到大枚举 k,可以得到最优分组
最后按上面规律输出即可

#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;
}
posted @   Frodnx  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示