欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > 2024 ICPC ShaanXi Provincial Contest ABFGLM题解

2024 ICPC ShaanXi Provincial Contest ABFGLM题解

2025/2/23 14:44:37 来源:https://blog.csdn.net/qq_39804992/article/details/141162173  浏览:    关键词:2024 ICPC ShaanXi Provincial Contest ABFGLM题解

A - chmod

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

AC代码:

#include<bits/stdc++.h>
using namespace std;#define int long longsigned 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 longsigned 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 longint 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 longsigned 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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词