第22次CCF计算机软件能力认证

这篇具有很好参考价值的文章主要介绍了第22次CCF计算机软件能力认证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一题:灰度直方图

解题思路:

哈希表即可

#include<iostream>
#include<cstring>

using namespace std;

const int N = 610;
int a[N];
int n , m , l;

int main()
{
	memset(a , 0 , sizeof a);
	cin >> n >> m >> l;
	for(int i = 0;i < n;i ++)
		for(int j = 0;j < m;j ++)
		{
			int x;
			cin >> x;
			a[x] ++;
		}
	
	for(int i = 0;i < l;i ++)
		cout << a[i] << " ";
	
	return 0;
}

第二题:邻域均值 

解题思路:

二维前缀和

#include<iostream>
#include<cstring>

using namespace std;

const int N = 610;
int s[N][N];
int n , l , r , t;

int main()
{
    memset(s , 0 , sizeof s);
    cin >> n >> l >> r >> t;
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= n;j ++)
        {
            int x;
            cin >> x;
            s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + x;
        }

    int res = 0;
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= n;j ++)
        {
            int x1 = max(1 , i - r) , y1 = max(1 , j - r);
            int x2 = min(n , i + r) , y2 = min(n , j + r);
            int sum = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
            int cnt = (x2 - x1 + 1) * (y2 - y1 + 1);

            if(sum <= t * cnt) res ++;
        }
    cout << res << endl;
    return 0;
}

第三题:DHCP服务器

解题思路:

认真读题,题目描述的非常清楚更具题目进行求解即可,

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1e5 + 10;

int n , tdef , tmax , tmin;
string h; // 本机名称

struct IP
{
    int st; // 0表示未分配、1表示待分配、2表示占用、3表示过期
    string owner; // 未分配状态没有占用者
    int t; // 待分配和占用状态拥有一个大于零的过期时刻
}ip[N];

int get_ip_d(string c)
{
    for(int i = 1;i <= n;i ++)
        if(ip[i].owner == c) return i;
    return 0;
}

int get_ip(int state)
{
    /*
    若没有,则选取最小的状态为未分配的 IP 地址
    若没有,则选取最小的状态为过期的 IP 地址
    */
    for(int i = 1;i <= n;i ++)
        if(ip[i].st == state) return i;

    return 0;
}

void update(string send)
{
    /*
    若不是,则找到占用者为发送主机的所有 IP 地址,
    对于其中状态为待分配的,将其状态设置为未分配,并清空其占用者,清零其过期时刻,处理结束
    */
    for(int i = 1;i <= n;i ++)
        if(ip[i].owner == send) 
        {
            if(ip[i].st == 1)
            {
                ip[i].st = 0;
                ip[i].owner = "";
                ip[i].t = 0;
            }

        }
}

void change(int tc)
{
    /*
    在到达该过期时刻时,若该地址的状态是待分配,则该地址的状态会自动变为未分配,
    且占用者清空,过期时刻清零;否则该地址的状态会由占用自动变为过期,且过期时刻清零。
    */

    for(int i = 1;i <= n;i ++)
        if(ip[i].t && ip[i].t <= tc)
        {
            if (ip[i].st == 1)
            {
                ip[i].st = 0;
                ip[i].owner = "";
                ip[i].t = 0;
            }
            else
            {
                ip[i].st = 3;
                ip[i].t = 0;
            }
        }
}

int main()
{
    cin >> n >> tdef >> tmax >> tmin >> h;
    int q;
    cin >> q;
    while(q --)
    {
        // <发送主机> <接收主机> <报文类型> <IP 地址> <过期时刻>
        string send , get , type;
        int x , tc , te;
        cin >> tc >> send >> get >> type >> x >> te;
        if(get != h && get != "*") 
        {
            // 判断接收主机是否为本机,或者为 *,若不是,则判断类型是否为 Request,若不是,则不处理;
            if(type != "REQ") continue; 
        }
        // 若类型不是 Discover、Request 之一,则不处理
        if(type != "REQ" && type != "DIS") continue;
        // 若接收主机为 *,但类型不是 Discover,或接收主机是本机,但类型是 Discover,则不处理。
        if(get == "*" && type != "DIS" || get == h && type == "DIS") continue;


        change(tc);
        // discover 报文
        if(type == "DIS")
        {
            int k = get_ip_d(send);
            if(!k) k = get_ip(0);
            if(!k) k = get_ip(3);
            if(!k) continue;

            // 将该 IP 地址状态设置为待分配,占用者设置为发送主机
            ip[k].st = 1 , ip[k].owner = send;
            // 若报文中过期时刻为 0 ,则设置过期时刻为 t+tdef
            if(!te) ip[k].t = tc + tdef;
            else
            {
                int w = te - tc;
                w = min(w , tmax) , w = max(w , tmin);
                ip[k].t = w + tc;
            }
            cout << h << " " << send << " OFR " << k << " " << ip[k].t << endl;
        }
        else
        {
            if(get != h) 
            {
                update(send);
                continue;
            }
            if(!(x <= n && x >= 1 && ip[x].owner == send))
            {
                cout << h << " " << send << " NAK " << x << " " << 0 << endl;
                continue;
            }
            // 无论该 IP 地址的状态为何,将该 IP 地址的状态设置为占用
            ip[x].st = 2;
            if (!te) ip[x].t = tc + tdef;
            else
            {
                int w = te - tc;
                w = max(w , tmin), w = min(w, tmax);
                ip[x].t = tc + w;
            }
            cout << h << " " << send << " ACK " << x << " " << ip[x].t << endl;
        }
    }
    return 0;
}

第四题:校门外的树

解题思路:

dp问题

设 f[i] 为用了前 i 个障碍点的所有方案

f[i]=(f[0]∗cnt1+f[1]∗cnt2+…+f[j]∗cnt3+…+f[i−1]∗cnt(i−1))

f[i] 在循环的时候已经计算出结果,计算cnt值为重中之重

cnt值,也就是两个位置之间可以整除的结果个数,也就是约数个数。

#include<iostream>
#include<cstring>
#include<unordered_map>
#include<vector>

using namespace std;

const int N = 1010 , M = 1e5 + 10 , mod = 1e9 + 7;
int n;
int a[N] , f[N];
unordered_map<int , vector<int>>mp;
bool st[M];

int main()
{
    for(int i = 1;i < M;i ++)
        for(int j = i * 2;j < M;j += i)
            mp[j].push_back(i); // 枚举因数
    cin >> n;
    for(int i = 0;i < n;i ++) cin >> a[i];
    f[0] = 1;
    for(int i = 1;i < n;i ++)
    {
        memset(st , 0 , sizeof st);
        for(int j = i - 1;j >= 0;j --)
        {
            int d = a[i] - a[j] , cnt = 0;
            for(int k : mp[d])
                if(!st[k])
                {
                    cnt ++;
                    st[k] = true;
                }
            st[d] = true;
            f[i] = (f[i] + (long long)f[j] * cnt) % mod;
        }
    }
    cout << f[n - 1] << endl;
    return 0;
}

第五题:疫苗运输

迪杰斯特拉+扩展欧几里得算法(不会)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

#define x first
#define y second

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int N = 510;
const LL INF = 0x3f3f3f3f3f3f3f3fll;

int n, m;
int len[N];
struct Node
{
    int cid, sum, pid;
};
vector<Node> ps[N];
vector<PII> line[N];  // x表示节点编号;y表示到下一个点的距离
LL dist[N], ans[N];
int pid[N];
bool st[N];

LL exgcd(LL a, LL b, LL &x, LL &y)  // 扩展欧几里得算法, 求x, y,使得ax + by = gcd(a, b)
{
    if (!b)
    {
        x = 1; y = 0;
        return a;
    }
    LL d = exgcd(b, a % b, y, x);
    y -= (a / b) * x;
    return d;
}


void dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    for (int i = 0; i < m; i ++ )
    {
        int d = 0;
        for (int j = 0; j < line[i].size(); j ++ )
        {
            if (line[i][j].x == 1)
            {
                dist[i] = d;
                pid[i] = j;
                break;
            }
            d += line[i][j].y;
        }
    }

    for (int i = 0; i < m; i ++ )
    {
        int t = -1;
        for (int j = 0; j < m; j ++ )
            if (!st[j] && (t == -1 || dist[j] < dist[t]))
                t = j;
        st[t] = true;

        auto& l = line[t];
        auto d = dist[t];
        for (int j = pid[t], k = 0; k < l.size(); j = (j + 1) % l.size(), k ++ )
        {
            for (auto& c: ps[l[j].x])
            {
                if (st[c.cid]) continue;  // 优化很重要
                LL a = d, b = len[t];
                LL x = c.sum, y = len[c.cid];
                LL X, Y;
                LL D = exgcd(b, y, X, Y);
                if ((x - a) % D) continue;
                X = (x - a) / D * X;
                y /= D;
                X = (X % y + y) % y;
                if (dist[c.cid] > a + b * X)
                {
                    dist[c.cid] = a + b * X;
                    pid[c.cid] = c.pid;
                }
            }
            d += l[j].y;
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i ++ )
    {
        int cnt, sum = 0;
        scanf("%d", &cnt);
        for (int j = 0; j < cnt; j ++ )
        {
            int ver, t;
            scanf("%d%d", &ver, &t);
            ps[ver].push_back({i, sum, j});
            line[i].push_back({ver, t});
            sum += t;
        }
        len[i] = sum;
    }

    dijkstra();
    memset(ans, 0x3f, sizeof ans);
    for (int i = 0; i < m; i ++ )
    {
        if (dist[i] == INF) continue;
        LL d = dist[i];
        for (int j = pid[i], k = 0; k < line[i].size(); j = (j + 1) % line[i].size(), k ++ )
        {
            int ver = line[i][j].x;
            ans[ver] = min(ans[ver], d);
            d += line[i][j].y;
        }
    }
    for (int i = 2; i <= n; i ++ )
        if (ans[i] == INF) puts("inf");
        else printf("%lld\n", ans[i]);

    return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-662233.html

到了这里,关于第22次CCF计算机软件能力认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第31次CCF计算机软件能力认证

    100+100+100+100+60=460 给定 (n) 个操作,每个操作将坐标 ((x,y)) 变为 ((x + dx, y + dy)) 。 给定 (m) 个点,问这 (m) 个点经过这 (n) 次操作变换后的坐标。 注意到操作是可合并的,因此可以先将这 (n) 个操作合并成一个操作,然后对每个点都经过这个操作变换即可,时间复杂度

    2024年02月08日
    浏览(34)
  • 第30次CCF计算机软件能力认证

    100+100+100+80+100=480 依次给定 (n) 个国际象棋局面,依次回答每个局面是第几次出现。 拿 map 记录下每个局面,统计计数即可。 神奇的代码 给定 (n times d) 的矩阵 (q, k, v) ,一个 (n) 维向量 (w) ,计算 ((w cdot (q times k^{T})) times v) 的结果。 (n leq 10^4, d leq 20) (q times k

    2024年02月06日
    浏览(34)
  • 第十四次CCF计算机软件能力认证

    第一题:买菜 在一条街上有 n 个卖菜的商店,按 1 至 n 的顺序排成一排,这些商店都卖一种蔬菜。 第一天,每个商店都自己定了一个价格。 店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。 具体的,每家

    2024年02月13日
    浏览(41)
  • CCF-CSP认证 202303 500分题解

    202303-1 田地丈量(矩形面积交) 矩形面积交=x轴线段交长度*y轴线段交长度 线段交长度,相交的时候是min右端点-max左端点,不相交的时候是0 202303-2 垦田计划(二分) 二分最终答案x(x=k),判断降到x天资源是否够 够的话就往小里二分,否则往大里二分, 当然贪心也可以做

    2023年04月18日
    浏览(50)
  • CCF CSP认证最新2022-12题解c++(全网首发)

    第一次写题解,代码没带注释,请谅解,尽力在题目分析中说明白. http://118.190.20.162/view.page?gpid=T160 问题描述 输入格式 输出格式 输出到标准输出中。 输出一个实数,表示该项目在当前价值标准下的总盈利或亏损。 题目分析 按照题意将除第一年外的每年x元都转换为当前的实际价

    2024年02月13日
    浏览(243)
  • 【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径

    本题所求的实际上是树的直径,即树中的任意两个结点之间的最大距离 采用的方法是dfs 从根节点开始遍历,对于每一个被dfs的结点m,返回此结点m到所有叶子结点的距离最大的那个即d1,同时在dfs过程当中记录结点m到所有叶子结点的距离第二大的那个,即d2 那么最终答案就是

    2024年02月09日
    浏览(43)
  • 【全年汇总】2023年CCF计算机图形学与多媒体会议截稿时间汇总(持续更新)

    本博文是根据2022年CCF会议推荐的 计算机图形学与多媒体领域 相关会议目录撰写,更多信息详见公众号CS Conference内容。 (完整PDF大家搜集好了,公众号后台回复“ CCF ”即可获得完整PDF。) 注: 由于一些会议的投稿时间还没公开,因此根据往年投稿时间在 表格中使用 ~ 符

    2024年02月08日
    浏览(53)
  • 第29次CCF CSP 认证题目 第一题 202303-1 田地丈量 C++实现 满分答案

    西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域,由左下角坐标 (x1,y1) 和右上角坐标 (x2,y2) 唯一确定,且满足 x1x2、y1y2。这 n 块田地中,任意两块的交集面积均为 0,仅边界处可能有所重叠。 最近,顿顿想要在南山脚下开垦出一块面积

    2023年04月15日
    浏览(56)
  • 【CCF推荐期刊】1/2/3区SCI,计算机通信、算法、人工智能、边缘计算、存储等领域,3个月左右录用

    1/2区计算机通信类 (CCF-C类) 【期刊简介】IF:5.0-6.0,JCR1/2区,中科院3区 【检索情况】SCIEI 双检,正刊 【参考周期】走期刊部系统,3-5个月左右录用 【截稿时间】 2023/3/31 【征稿领域】 涵盖未来计算机通信网络各个方面,如与边缘雾计算、5G及其他物联网应用的结合研究

    2024年02月10日
    浏览(63)
  • ccf csp 202212星际网络 4分(未优化)

    思路 :1. 将卫星看作边的一部分,经过卫星的延迟即为该边的权重。2. 因为还要求返回的时间,所以是求任意两点的最短路径,用Floyd算法。3. 用快速幂处理爆long long

    2024年02月14日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包