首页 > 其他分享 >2023年 8月7日普及组南外集训题解

2023年 8月7日普及组南外集训题解

时间:2023-08-08 20:45:20浏览次数:35  
标签:tmp cnt 组南外 int 题解 sum 2023 ans

A 国家集训队

题解

注意数据已经是有序的,我还搞了个排序,我是智障 所以只需要将第5个人到第16个人的成绩都预设成300,再把前4个人的成绩都预设成0,再看有没有人能超过第4个人就行了

ac代码

#include <iostream>
using namespace std;
const int N = 20;
int a[N], ans = 4;
int main() {
    for (int i = 1; i <= 16; i++) cin >> a[i];
    for (int i = 5; i <= 16; i++) {
        if (a[i] + 300 > a[4])
            ans++;
        else
            break;
    }
    cout << ans;
    return 0;
}

B 撑伞

题解

想要所有人都不被淋,那么最长的距离就是 \(n+2×D\) ,每个人如果有伞的话,能覆盖到的地方就是 \((1+2×D)\),相除就行了

ac代码

#include <iostream>
using namespace std;
int n, k;
int main() {
    cin >> n >> k;
    cout << (n + 2 * k) / (2 * k + 1);
    return 0;
}

C 走遍城市

题解

非常简单的数学题,也就是找出来一个数 \(x\) ,使得它和初始位置能凑出来 \(p_i\) 就行了,具体看代码

ac代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int p[N];
int n, x, ans;
int main() {
    cin >> n >> x;
    for (int i = 1; i <= n; i++) {
        int k;
        cin >> k;
        ans = __gcd(ans, abs(k - x));
    }
    cout << ans;
    return 0;
}

D 魔法筷子

题解

我们可以只考虑第三个情况,一二情况直接贪心

我们可以假设我们的 A B C 筷子初始为0,然后累加

注意最后减30,因为等于0的时候,实际上不是合并筷子

ac 代码

#include <iostream>
using namespace std;
const int N = 10;
int l[N];
int n, ans = 0x3f3f3f3f, A, B, C;
void dfs(int u, int x, int y, int z, int magic) {
    if (x && y && z)
        ans = min(ans, abs(x - A) + abs(y - B) + abs(z - C) + magic - 30);
    if (u > n)
        return;
    dfs(u + 1, x + l[u], y, z, magic + 10);
    dfs(u + 1, x, y + l[u], z, magic + 10);
    dfs(u + 1, x, y, z + l[u], magic + 10);
    dfs(u + 1, x, y, z, magic);
}
int main() {
    cin >> n >> A >> B >> C;
    for (int i = 0; i < n; i++) cin >> l[i];
    dfs(0, 0, 0, 0, 0);
    cout << ans;
    return 0;
}

E 马农

题解

这道题可以用二维前缀和来优化

注意这题有两种情况,题目的图片有就不多赘述了

我使用了一个cnt数组来记录收益的情况并加了一个偏移量来防止负数的情况

首先两重循环枚举交点,注意是枚举到 \(n-1\) ,不然就没位置了,然后再分别枚举两个矩形的位置,把第一个矩形算出来的收益用cnt数组记录,然后另外一个矩形的收益如果跟第一个矩形一样,答案就加上

不能用memset初始化,我们可以把所有用到的位置记录下来,然后将这些位置归0就行了,不然会2000万会爆

ac代码

#include <iostream>
using namespace std;
int x;
const int N = 105, convertnum = 1000000;  //防止负数
short cnt[20000005];
int nums[N];  //去重
int sum[N][N];
int top, ans, n;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> x;
            sum[i][j] = x + sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1];
        }
    }
    //两种情况,一种两个都横着,一种一个竖着,一个横着
    // i枚举到n-1,不然没位置了 j同理
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < n; j++) {
            for (int k = 1; k <= i; k++) {
                for (int l = 1; l <= j; l++) {
                    int tmp = sum[i][j] - sum[i][l - 1] - sum[k - 1][j] + sum[k - 1][l - 1];
                    if (!cnt[tmp + convertnum])
                        nums[++top] = tmp + convertnum;
                    cnt[tmp + convertnum]++;
                }
            }
            for (int k = n; k > i; k--) {
                for (int l = n; l > j; l--) {
                    int tmp = sum[k][l] - sum[i][l] - sum[k][j] + sum[i][j];
                    ans += cnt[tmp + convertnum];
                }
            }
            //后面还要用
            for (int k = 1; k <= top; k++) cnt[nums[k]] = 0;
            top = 0;
        }
    }
    for (int i = 1; i < n; i++) {
        for (int j = n; j > 1; j--) {
            for (int k = 1; k <= i; k++) {
                for (int l = n; l >= j; l--) {
                    int tmp = sum[i][l] - sum[k - 1][l] - sum[i][j - 1] + sum[k - 1][j - 1];
                    if (!cnt[tmp + convertnum])
                        nums[++top] = tmp + convertnum;
                    cnt[tmp + convertnum]++;
                }
            }
            for (int k = n; k > i; k--) {
                for (int l = 1; l < j; l++) {
                    int tmp = sum[k][j - 1] - sum[k][l - 1] - sum[i][j - 1] + sum[i][l - 1];
                    ans += cnt[tmp + convertnum];
                }
            }
            for (int k = 1; k <= top; k++) cnt[nums[k]] = 0;
            top = 0;
        }
    }
    cout << ans;
    return 0;
}

标签:tmp,cnt,组南外,int,题解,sum,2023,ans
From: https://www.cnblogs.com/xiaozhu0602/p/17615325.html

相关文章

  • 2023-08-08:给你一棵 n 个节点的树(连通无向无环的图) 节点编号从 0 到 n - 1 且恰好有 n
    2023-08-08:给你一棵n个节点的树(连通无向无环的图)节点编号从0到n-1且恰好有n-1条边给你一个长度为n下标从0开始的整数数组vals分别表示每个节点的值同时给你一个二维整数数组edges其中edges[i]=[ai,bi]表示节点ai和bi之间有一条无向边一条好路......
  • UESTC 2023 Summer Training #23 for div2/2022-2023 ACM-ICPC Latin American Region
    Preface今天这场签到巨多,和昨天那场形成了鲜明的对比但可惜后盘的时候我划了太久的水,最后接了B题然后没调出来成为战俘最气的是赛后发现原来是没注意输出格式,本来可以说一遍过的题结果没写过,属实可惜,就当长教训了以后一定要尤其注意输入输出格式A.AskingforMoneyORZ徐......
  • 2023-08-08:给你一棵 n 个节点的树(连通无向无环的图) 节点编号从 0 到 n - 1 且恰好有 n
    2023-08-08:给你一棵n个节点的树(连通无向无环的图)节点编号从0到n-1且恰好有n-1条边给你一个长度为n下标从0开始的整数数组vals分别表示每个节点的值同时给你一个二维整数数组edges其中edges[i]=[ai,bi]表示节点ai和bi之间有一条无向边一条好路径需要......
  • 2023年百度之星程序设计竞赛初赛1题解
    每次出题都出其不意---->群友蓝桥国三ac一道题根据官方的视频题解整理依据难度的划分第五题:促销糖果 分析:从答案出发想吃K个糖果,必定有k个糖纸,考虑换购,则有一张糖纸是不可以换的(因为你必须至少要买一颗糖果)则换购的数量为(k-1)/减去换购的糖果则是买的糖果packageLi2209;i......
  • 2023.8.8 周二:replace All
    1/*2输入格式:3输入在一行中给出一句话,即一个非空字符串,由不超过1000个英文字母、数字和空格组成,以回车结束。45输出格式:6从左到右扫描输入的句子:如果句子中有超过3个连续的6,则将这串连续的6替换成9;但如果有超过9个连续的6,则将这串连续的6替换成27......
  • 2023 *CTF flagfile
    flagfile格式文件是mgc,题目提示用file命令查看观察后,忽略有规律的,取出没规律的将红圈的数字异或,得到第一组数据这里发现后面是ffff,从这里隔开,异或的数据作为第二组异或的数据都将其转为十进制后,发现第二组可能是ascII编码,转化得到:f_o_a__lhy_s_y^^hete_ug___goo_t_第一......
  • CodeForces CF1846G 题解
    CodeForcesCF1846G题解CodeForces题目链接洛谷题目链接标准答案是状压之后,转化成Dijkstra算法跑最短路。我这里提供一个不一样的思路。题意简述主人公得了病,有部分类型的症状。所有类型症状共有\(n\)种,用长为\(n\)的01串表示是否有那种症状。共有\(m\)种药,吃......
  • 行业追踪,2023-08-08
    自动复盘2023-08-08凡所有相,皆是虚妄。若见诸相非相,即见如来。k线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让市场来告诉你跟踪板块总结:成交额超过100亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行......
  • 20230808巴蜀暑期集训测试总结
    挂分连挂两天!挂的都是水题!T1两个地方,就三个字符的问题,大小样例居然都没有反映出来,当时想着这道题比较水,之前还去上了个厕所,不能再浪费时间,打完就走了,结果直接挂\(50pts\),比昨天挂的都多。所以,写完就拍!,其实如果前三题都拍了拿\(300\)也比T1挂\(50\)再打个T4\(10pts\)暴......
  • 【BZOJ 3364】Distance Queries 距离咨询 题解
    原题简化题意:有一棵\(n\)个点的树,\(q\)组询问,每次询问回答两点间的距离。令\(dis[i][j]\)表示\(i\)到\(j\)的距离,根节点为\(rt\),则有\(dis[i][j]=dis[rt][i]+dis[rt][j]-2×dis[rt][lca(i,j)]\),按照题意打即可。#include<bits/stdc++.h>usingnamespacestd;#d......