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;
}

UIUC ICPC Spring Coding Contest 2019是UIUC(伊利诺伊大学厄巴纳-香槟分校)举办的一个编程比赛。UIUC ICPC Spring Coding Contest 2019是ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest)的一部分。ACM国际大学生程序设计竞赛是世界上最具影响力的大学生计算机竞赛之一,每年吸引了来自全球各地的大学生参与。这个比赛旨在培养学生的算法和编程技能,提供一个展示和交流的平台。参赛者需要在规定时间内解决一系列编程问题。 参加UIUC ICPC Spring Coding Contest 2019对于那些对算法和编程有兴趣的学生来说,是一个很好的学习和锻炼机会。比赛中的问题通常涉及各种算法和数据结构,要求参赛者能够用编程语言实现有效和高效的解决方案。参赛者可以通过解决问题来提高他们的算法和编程技能,并与其他参赛者交流和学习。 在准备UIUC ICPC Spring Coding Contest 2019之前,建议参赛者先掌握一些基本的编程知识和技能,如数据结构、算法、编程语言等。参赛者可以参考一些相关的教程和学习资料,如GeeksforGeeks和HackerEarth等网站提供的编程教程。此外,还可以参考一些竞赛经验分享的文章和博客,了解其他人是如何准备和参加编程比赛的。 总之,参加UIUC ICPC Spring Coding Contest 2019是一个很好的机会,可以提高算法和编程技能,与其他参赛者交流和学习。准备比赛前,建议参赛者掌握基本的编程知识和技能,并参考一些相关的教程和学习资料。祝你在比赛中取得好成绩!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Awesome Competitive Programming Awesome](https://blog.csdn.net/qq_27009517/article/details/86593200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值