首页 > 其他分享 >ICPC2023 陕西邀请赛 题解

ICPC2023 陕西邀请赛 题解

时间:2024-03-30 13:00:31浏览次数:25  
标签:ICPC2023 nxt return insert int 题解 cf double 邀请赛

G - Permutation

Question

找到一个排列 \(p\),使得 \(\prod_{i=1}^n lcm(p_i,p_{(i mod n) +1})\) 最大

Solution

考虑到 \(x\) 和 \(x-1\) 必然是互质的

所以顺序排列即可

Code

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n; cin >> n;
    for (int i = 1; i <= n; i++)
        cout << i << " ";
    return 0;
}

J - Target

Quesion

给出一个数 \(x(0\le x \le 1)\) ,每次可以对 \(x\) 进行两种操作之一:

  • 1.\(x=x/2\)
  • 2.\(x=(x-1)/x+1\)

需要把 \(x\) 变成 \(y\),认为 \(|x-y| \le 10^{-4}\) 则认为是相同的

输出一种可信的方案

Solution

观察到两个数如果相差小于 \(10^{-4}\) 则是相同的,所以在 \(0\sim 1\) 这个范围内,至多存在 \(10^4\) 个数

直接 \(BFS\),然后判断一个数是否被遍历过即可

如何判断呢?我使用了 \(set\) 来找与一个数最接近的数

Code

#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-5;

int cmp(double x, double y) {
    if (fabs(x - y) < eps) return 0;
    return x < y ? -1 : 1; // x < y 返回 -1, x > y 返回 1
}

set<pair<double, string> > mp;

int main() {
    // freopen ("J.in", "r",stdin);
    double a, b;
    cin >> a >> b;
    queue<double> q; q.push(a);
    mp.insert({a, ""});

    while (!q.empty()) {
        double u = q.front(); q.pop();
        
        auto it = mp.lower_bound({u,""});
        double v = it->first; string s = it->second;

        auto insert = [&] (double nxt_u, string s) {
            if (nxt_u < 0 || nxt_u > 1) return;

            if (cmp(nxt_u, b) == 0) {
                if (s.size() > 50)
                    s = s.substr(0, 50);
                cout << s << endl;
                exit(0);
            }
            
            double v = mp.lower_bound({nxt_u, ""})->first;
            if (cmp(v, nxt_u) == 0) return; // 存在
            mp.insert({nxt_u, s});
            q.push(nxt_u);
        };

        insert(u * 0.5 , s + "1"); 
        insert((u - 1.0) * 0.5 + 1, s + "2");
    }
    return 0;
}

H - Spin the Wheel

Solution

一般形式下的差分数组 \(d[i]=a[i]-a[i-1]\),默认 \(a[0] = 0\)

我们这里定义 \(d[1]=a[1]-a[n]\)

一次 \(2\) 操作是对于差分数组同时 \(+1\)

所以说,如果 \(a\) 的差分数组不是一个值则输出 \(-1\)

否则需要 \(d[i]\) 次 \(2\) 操作

然后考虑旋转,如果不旋转,\(a[0]\) 每次都只能 \(+0\) ,所以 \(a[0]\) 必然为 \(0\)

由于 \(a[0]\) 在 \(0\sim n-1\) 之间,所以需要最后一个把 \(a[0]\) 旋转到 \(0\) 位置即可

也就是说,\(1\) 操作最多进行 \(1\) 次

特殊考虑差分为 \(0\) 的情况,如果 \(a[0]=0\) 答案是 \(0\),否则答案是 \(n\)

Code

#include <bits/stdc++.h>
using namespace std;
int main() {
    // freopen ("H.in","r",stdin);
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int ccf = -1;
    for (int i = 0; i < n; i++) {
        int cf = a[i] - a[(i - 1 + n) % n];
        cf = (cf + n) % n;
        if (ccf == -1) ccf = cf;
        else if (ccf != cf) {
            cout << -1 << endl;
            return 0;
        }
    }
    if (a[0] == 0) {
        if (ccf == 0) 
            cout << 0 << endl;
        else 
            cout << ccf << endl;
    }
    else {
        if (ccf == 0)
            cout << n + 1 << endl;
        else
            cout << ccf + 1 << endl;
    }
    return 0;
}

标签:ICPC2023,nxt,return,insert,int,题解,cf,double,邀请赛
From: https://www.cnblogs.com/martian148/p/18105353

相关文章

  • 快递员的烦恼【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-快递员的烦恼快递公司每日早晨,给每位快递员推送需要送到客户手中的快递以及路线信息,快递员自己又查找了一些客户与客户之间的路线距离信息,请你依据这些信息,给快递员设计一条最短路径,告诉他最短路径的距离。注意:不限制快递包裹送到客户手中的顺序,但必须保证都送......
  • 园区参观路径【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-园区参观路径园区某部门举办了FamilyDay,邀请员工及其家属参加;将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;家属参观园区时,只能向右和向下园区前进;求从起始园区到终点园区会有多少条不同的参观路径;输入描述:第一行为园区长和宽;后面每一行表示......
  • [题解]P1439 【模板】最长公共子序列
    P1439【模板】最长公共子序列题意简述给出\(1,2,…,n\)的两个排列\(P_1\)和\(P_2\),求它们的最长公共子序列。范围限制:\(n\le10^5\)。样例53214512345输出:3。思路简述这道题看似是最长公共子序列,但是发现如果用\(O(n^2)\)的复杂度实现\(LCS\)就会时......
  • 2024年03月CCF-GESP编程能力等级认证C++编程八级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有......
  • 2024年03月CCF-GESP编程能力等级认证C++编程七级真题解析
    本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题下列关于排序的说法,正确的是()。A.冒泡排序是最快的排序算法之一。B.快速排序通常是不稳定的。C.最差情况,N个元素做归并排序......
  • ccfcsp-2019-12-2回收站选址(c++满分题解)
    该题就是考察点的保存以及索引的保存和遍历,看了他的用例说明,我原先以为暴力只能得50分,但是又没有想到别的优化方法,就写了一下暴力,发现居然AC下面是代码:#include<iostream>#include<vector>#include<map>usingnamespacestd;intmain(){ intn; cin>>n; vector<pair<......
  • atcoder beginner 346 题解
      看到别人的视频讲解 AtCoderBeginnerContest346A至G題讲解bydreamoon C如果用sort写,那么再从小到大遍历也需要写几行#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<cstdbool>#include<string>#include<......
  • P1484 种树 题解
    P1484种树有\(n\)个坑。第\(i\)个坑种树的价值是\(c_i\),相邻坑不能同时种。可以种\(k\)颗树,求最大价值。模拟费用流,建图类似这样:中间两层结点之间有\(7\)条边,表示\(n=7\)的情况。相邻两条边,例如\(1,2\)总流入量为\(1\),\(2,3\)总流出量为\(1\),也不可能出现相......
  • Luogu P6834 梦原 题解
    原题传送门首先考虑如果树的形态确定了之后的情况:如果当前点比爸爸的值大,那么显然爸爸变成\(0\)之后,这个点需要自己被额外操作删除,贡献就是\(a[v]-a[u]\)。类似,如果比爸爸的值小,那么这个点肯定会跟爸爸一起被删除,所以贡献就是\(0\)。综上所述,一个点的贡献是\(max{a[v]-......
  • ICPC2023 杭州 题解
    M-V-DiagramSolution很显然,连续的子序列的一段肯定是包括最左边或最右边的其中一个点Code#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllinf=1ll<<60;intmain(){intt;cin>>t;while(t--){ intn;cin>>n;......