2024 ICPC ShaanXi Provincial Contest ABFGLM题解

A - chmod

思路:按题意模拟,字符串拆数字,数字转二进制,然后按需求输出即可

AC代码:

#include<bits/stdc++.h>
using namespace std;

#define int long long

signed main() {
    int t;
    cin >> t;
    while(t--) {
        char nn;
        for (int j = 1; j <= 3; j++) {
            cin >> nn;
            string s;
            int n = nn-'0';
            while (n) {
                if (n & 1) s = '1' + s;
                else s = '0' + s;
                n >>= 1;
            }
            while (s.length() < 3) s = '0' + s;
            if (s[0] == '1') cout << 'r';
            else cout << '-';
            if (s[1] == '1') cout << 'w';
            else cout << '-';
            if (s[2] == '1') cout << 'x';
            else cout << '-';
        }cout << endl;
    }
    return 0;
}

B - Expression Matrix

思路:(总共就36种情况,大不了手敲) 太累了不能选择手敲,而且伤眼睛。 

          贪心思路:数字只能有11和1,11*1 比 11+1 要优,但不能出现11*11的情况

          在此基础之上,分出三种情况:

          1、长宽都是偶数:四周都是1,中间横纵 * 和 1 交错输出即可

          2、长宽一奇一偶:以长奇宽偶的情况举例,四周都是1,中间先全部都是 1 和 * 交替,这时可以发现出现了 11*11 的情况,这时在出现这一情况的行将一个 * 换成 + 就可以了

          3、长宽都是奇数:在上一种情况下更进一步,行和列都会出现 11*11 的情况,这时以对角线的路径将 * 换成 + 效率最高,如果 长宽不相等 则继续在最后继续换 * 为 + 即可

AC代码:

#include<bits/stdc++.h>
using namespace std;

int n,m;

int main(){
    cin>>n>>m;
    if(n%2 && m%2){ //俩鸡
        char crr[n+1][m+1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i==1 || i==n) crr[i][j]='1';
                else if(i!=1 && i!=n && (j==1 || j==m)) crr[i][j]='1';
                else if(i!=1 && i!=n && !(j==1 || j==m)){
                    if(i%2){
                        if(j%2) crr[i][j]='*';
                        else crr[i][j]='1';
                    }
                    else{
                        if(j%2) crr[i][j]='1';
                        else crr[i][j]='*';
                    }
                }
            }
        }
        if(n==m){
            for(int i=3;i<=n-2;i+=2){
                 crr[i][i]='+';
            }
        }
        else if(n<m){
            for(int i=3;i<=n-2;i+=2){
                crr[i][i]='+';
            }
            for(int i=n-2;i<m;i++){
                if(crr[n-2][i]=='*') crr[n-2][i]='+';
            }
        }
        else if(n>m){
            for(int i=3;i<=m-2;i+=2){
                crr[i][i]='+';
            }
            for(int i=m-2;i<n;i++){
                if(crr[i][m-2]=='*') crr[i][m-2]='+';
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cout<<crr[i][j];
            }cout<<'\n';
        }
    }
    else if(n%2==0 && m%2==0){ //俩藕
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i==1 || i==n) cout<<'1';
                else if(i!=1 && i!=n && (j==1 || j==m)) cout<<'1';
                else if(i!=1 && i!=n && !(j==1 || j==m)){
                    if(i%2){
                        if(j%2) cout<<'1';
                        else cout<<'*';
                    }
                    else{
                        if(j%2) cout<<'*';
                        else cout<<'1';
                    }
                }
            }cout<<'\n';
        }
    }
    else if(n%2==0 && m%2){ //藕鸡
        for(int i=1;i<=n;i++){
            bool flag = 1;
            for(int j=1;j<=m;j++){
                if(i==1 || i==n) cout<<'1';
                else if(i!=1 && i!=n && (j==1 || j==m)) cout<<'1';
                else if(i!=1 && i!=n && !(j==1 || j==m)){
                    if(i%2){
                        if(j%2 && flag) flag=0,cout<<'+';
                        else if(j%2 && !flag) cout<<'*';
                        else cout<<'1';
                    }
                    else{
                        if(j%2) cout<<'1';
                        else cout<<'*';
                    }
                }
            }cout<<'\n';
        }
    }
    else if(n%2 && m%2==0){ //鸡藕
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(i==1 || i==n) cout<<'1';
                else if(i!=1 && i!=n && (j==1 || j==m)) cout<<'1';
                else if(i!=1 && i!=n && !(j==1 || j==m)){
                    if(i%2){
                        if(i==3 && j%2) cout<<'+';
                        else if(i!=3 && j%2) cout<<'*';
                        else cout<<'1';
                    }
                    else{
                        if(j%2) cout<<'1';
                        else cout<<'*';
                    }
                }
            }cout<<'\n';
        }
    }
    return 0;
}

F - Try a try, AC is OK 

思路: 按位与 操作只能将数变小,题目又允许重复使用数字,所以输出最大数即可

AC代码:

#include<bits/stdc++.h>
using namespace std;

#define int long long

signed main() {
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        int ma = 0;
        for (int i = 1; i <= n; i++) {
            int x;
            cin >> x;
            if(x > ma)ma = x;
        }
        cout << ma << endl;
    }
    return 0;
}

G - Disappearing Number

思路:以消失的数为9为例,此时我们可以发现就是9进制转10进制的问题,推广到其他情况,将数字的每一位数与 消失的数x 比较,若比x大则该为数减一,随后进行9进制转10进制的操作,注意0也算在自然数中,ans初始值要设成1,最后输出即可

AC代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<math.h>
#include<vector>

using namespace std;
#define int long long

int qpow(int power,int base) {
    int res = 1;
    while(base) {
        if(base & 1) {
            res *= power;
        }
        power*= power;
        base >>=1;
    }
    return res;
}

signed main() {
    int t;
    cin >> t;
    while(t--) {
        string s;
        int n;
        cin>>s>>n;
        int ans=0;
        for(int i=0;i<s.size();i++){
            if(s[i]-'0'>=n){
                ans+=(s[i]-'0'-1)*qpow(9,s.size()-i-1);
            }
            else{
                ans+=(s[i]-'0')*qpow(9,s.size()-i-1);
            }
        }
        cout<<ans+1<<endl;

    }
    return 0;
}

L - Chess

思路:从奇数看起,奇数一定取二进制就行了,因为二进制下所有的LNC数都是奇数,而后手永远只能拿到偶数,所以先手必胜

         再来看偶数,通过几次手推可以发现,从1开始枚举i, 第一个该偶数不能整除的i 即为答案,可以发现在i进制下,该偶数本身就是自己的LNC数,先手直接取走即可

AC代码:

#include<bits/stdc++.h>
using namespace std;

#define int long long

signed main() {
    int n;
    cin >> n;
    while(n--) {
        int x;
        cin >> x;
        int i;
        for (i = 2; i<= x; i++) {
            if(x % i != 0) break;
        }cout << i << endl;
    }
    return 0;
}

M - Window Decoration

思路:初始ans=点数*2,随后判断各点之间距离,重合的面积-2,相距为1的面积-0.5

AC代码:

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define PII pair<int,int>
vector<PII>b;

signed main() {
    int n;
    cin >> n;
    set<PII>a;
    for (int i = 1; i <= n; i++) {
        int x,y;
        cin >> x >> y;
        a.insert({x,y});
    }double sum = 2*a.size();
    for (auto x : a) {
        b.push_back(x);
    }
    for (int i = 0; i < b.size(); i++) {
        for (int j = 0; j < i; j++) {
            if(b[i].first == b[j].first && abs(b[i].second-b[j].second) == 1) {
                sum-=0.5;
            }
            else if(b[i].second == b[j].second && abs(b[i].first - b[j].first) == 1) sum-=0.5;
        }
    }
    cout << sum;
    return 0;
}

<think>嗯,用户想要找2024ICPC昆明邀请赛的题目解析,但根据提供的引用内容,现有的资料只覆盖到2022年昆明的题目,比如引用[1]提到2020、2021年的ICPC和CCPC题目,以及引用[4]详细解析了2022昆明站的G题。不过用户询问的是2024年的,这可能还没有公开的解析,或者可能还没有举办。需要先确认是否存在2024年的比赛信息,或者是否用户可能记错了年份?比如,2024年的比赛可能尚未举行,或者相关信息还未被整理发布。 首先,检查提供的引用内容,发现最新的昆明站信息是2022年的,引用[4]讨论的是2022昆明G题。用户提到的2024年可能是个错误,或者他们希望提前获取信息。但通常比赛结束后才会有解析,所以需要告知用户目前没有相关资料,并建议他们关注官方渠道或后续的社区分享。同时,可以推荐现有的2022年昆明题解作为参考,帮助用户了解题型和考点,比如动态规划、期望计算等常见问题。 另外,用户可能对如何准备比赛感兴趣,可以建议他们分析历年题目类型,比如引用[1]提到的区域赛常考题型,或者引用[3]中提到的训练经验。需要确保回答准确,避免提供不存在的资源,同时提供有用的替代信息,帮助用户找到最近的可用资料。</think>关于2024ICPC昆明邀请赛题目解析,目前尚未有官方或主流平台发布完整的题目解析报告。根据历史信息推测,ICPC区域赛的题目解析通常会在赛后由参赛队伍、算法社区或教练团队逐步整理发布。以下是可参考的备赛建议和现有资源: --- ### 一、近期ICPC题型趋势参考 1. **动态规划与组合数学** 如2022年昆明站G题考察了**概率期望与递推关系**,需掌握马尔可夫链、状态转移方程的建立[^4] $$E = \sum_{i=1}^n \left( \frac{p_i}{1-p_i} \cdot \sum_{j \neq i} \frac{p_j}{1-p_i} \right)$$ 此类问题常需分析极限状态下的数学期望。 2. **数据结构优化** 近年区域赛常出现需要**线段树/树状数组维护区间性质**的题目,例如区间最值、历史版本查询等。 3. **图论与网络流** 包括最小割建模、分层图最短路等高级技巧,如2021年沈阳站曾出现网络流与二分答案结合的题目[^2]。 --- ### 二、获取解析的途径建议 1. **官方渠道** 关注ICPC官网及昆明站承办院校的赛事公告,解析可能通过**赛后题解报告会**发布。 2. **算法社区** - **Codeforces**:搜索标签`[ICPC Kunming 2024]` - **知乎/掘金**:技术博主常撰写详细题解(例:2022年G题推导过程) 3. **训练平台** 尝试在**Codeforces Gym**或**牛客竞赛**题库中查找昆明站模拟赛题。 --- ### 三、历届昆明站真题参考 若需练习类似题型,可参考2022年昆明站题目: - **G题(豆子操作期望)**:结合概率论与递推,需推导稳定状态下的位置关系 - **B题(几何构造)**:通过坐标系变换简化多边形切割问题 ```python # 示例:概率期望计算的代码框架 def calculate_expected_value(probabilities): n = len(probabilities) expected = 0.0 for i in range(n): pi = probabilities[i] term = pi / (1 - pi) if pi != 1 else 0 sum_other = sum(pj / (1 - pi) for j, pj in enumerate(probabilities) if j != i) expected += term * sum_other return expected ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值