目录

  • A.Hello 小明
  • B.博学多识的小明
  • C.小明爱偶数
  • D.小明爱打单词
  • E.小明打篮球
  • F.小明爱数学
  • G.小明与张三
  • H.小明拿宝藏
  • I.小明的考试成绩
  • J.小明与鲜花
  • K.小明与小红的增删图游戏
  • 后记

A.Hello 小明

本题作为本场最简单的签到题,改编于hello world,想考察大家的字符串输入输出能力。

#include<bits/stdc++.h>
using namespace std;
int main(){string s;cin>>s;cout<<"Hello "<<s<<endl;return 0;
}

B.博学多识的小明

匹配句子中出现的Abandon/abandon,因为有空格,在c++中使用getline将整体一行读入。因为不需要考虑后缀,也可以根据空格将字符串分成一个一个单独的单词或标点。
我这里给出,直接去遍历整行句子,遇到A或者a就进入判断,判断下一个是否为b,下下个是否为a,以此类推。特别的,为了减小难度,整个单词如果前缀不满足,那么就不可能出现该单词后缀包含abandon的情况。

#include<bits/stdc++.h>
using namespace std;
string t="abandon";
int ans;
int main(){string s;getline(cin,s);for(int i=0;i<s.size();i++){if(s[i]==t[0]||s[i]=='A'){int idx=i;for(int j=1;j<=6;j++){if(s[++i]==t[j]) ;else{i=idx;break;}}if(i!=idx){ans++;}}}cout<<ans<<endl;return 0;
}

C.小明爱偶数

题目挺唬人,但是理清楚题意后很简单。
题目意思为给定一个 nnn ,可以倒置它的一个从起始位置开始的子区间,使得最终该数变成一个偶数。
最终的结果集为 {−1,0,1,2}\{-1,0,1,2\}{−1,0,1,2} 。我们读题后不难发现如果能翻转成偶数,那么最多两次一定能实现。第一次以该位偶数为结尾,倒置,将该位变成首位,然后再整体倒置,将该位变成最后一位。

  • 当 nnn 的每一位都是奇数时,结果为 -1
  • if当 nnn 的末位为偶数时,结果为0
  • else if当 nnn 的首位是偶数时,结果为1
  • else if当 nnn 的某一位置为偶数时,结果为2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){int t;cin>>t;while(t--){ll n;cin>>n;if(n%2==0) cout<<0<<endl;else{vector<int> ve;while(n){int tem=n%10;ve.push_back(tem);n/=10;}int ans=-1;for(int i=ve.size()-1,j=1;i>=0;i--,j++){if(ve[i]%2==0){ans=j;break;}}if(ans>=2) ans=2;cout<<ans<<endl;}}return 0;
}

D.小明爱打单词

又是一道题目挺唬人,但是理清楚题意后很简单的题。
首先我们用map键值对记录键盘中每个字符所在的位置,用数组同理,可以记录a~z每个字符的位置。然后遍历一遍所给的单词,从第二位开始,直接累加该单词的第ii-1位的字符在键盘中所在位置的距离差即可。记得取绝对值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<char,int> mp;
int main(){int t;cin>>t;while(t--){mp.clear();string s;cin>>s;for(int i=0;i<s.size();i++){mp[s[i]]=i;}string opp;cin>>opp;ll ans=0;for(int i=1;i<opp.size();i++){ans+=abs(mp[opp[i]]-mp[opp[i-1]]);}cout<<ans<<endl;}return 0;
}

E.小明打篮球

小明在第 nnn 局使用招式,必胜。其它局的胜率为 50%
而且,根据这句话的提示:
说明:获得胜利的条件是小明在 xxx 局比赛中赢下 (x+1)2\frac{(x+1)}{2}2(x+1)​ 局以上,例如3局2胜,5局3胜…
可以列出公式:(x+1)2=n\frac{(x+1)}{2}=n2(x+1)​=n
解得:x=2⋅n−1x=2·n-1x=2⋅n−1 即为最终答案。
解释:小明会在除第 nnn 局的共 x−1x-1x−1 局的偶数局中赢得一半的胜利。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){int t;cin>>t;while(t--){ll n;cin>>n;cout<<(2*n-1)<<endl;}return 0;
}

F.小明爱数学

本题也是一个十分简单的签到题,是我出题出到一半,突然觉得前面有点不符合预期难度,所以又加了一道简单题。还有点小私心,拿自己名字命了个名。
写过斐波那契数列的同学应该都能一眼出结果,给定首项和第二项然后去用公式模拟到第 nnn 项,因为 nnn 比较小用了一个数组。

#include<bits/stdc++.h>
using namespace std;
int f[105];
int main(){int n,a,b;cin>>n>>a>>b;f[1]=a;f[2]=b;for(int i=3;i<=n;i++){f[i]=(f[i-1]+f[i-2])%8;}cout<<f[n]<<endl;return 0;
}

G.小明与张三

有多少个格子可以通过命令走出去。
就是一道搜索类的小模拟题,本来是要剪枝的,但是因为oj里面c++和Java,Python都只能开同一个时间限制,所以考虑到可能会TLE,就没卡数据,我也不知道不剪枝写能不能过,反正我写题解的时候还没开始比赛。
写法就是以每一个点作为起点,去搜索,通过指令进行上下左右的移动,然后判断是否在循环(失败),或者已经走出边界(成功)。
判断是否在循环给两种方式,一是访问到了之前访问过的点,用vis[]数组提前记录访问过的点;二是深搜走的深度是不是超过了 n⋅mn·mn⋅m 步,那就说明一定是在循环。
最后通过统计能走出的点的个数输出即可。
剪枝:当该点走到之前已经记录好能出去的点时,就不需要再向下搜索,可以直接返回true值,表示成功走出边界。

#include<bits/stdc++.h>
using namespace std;
char mp[1005][1005];
int vis[1005][1005];
int ris[1005][1005];
int n,m;
// W A S D
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}
};
map<char,int> mpp;
bool check(int x,int y){if(x<1||x>n||y<1||y>m) return true;else return false;
}
bool dfs(int x,int y){if(check(x,y)){ris[x][y]=1;return true;}int k=mpp[mp[x][y]];int xx=x+dir[k][0],yy=y+dir[k][1];if(ris[xx][yy]) return true;if(vis[xx][yy]) return false;vis[xx][yy]=1;if(dfs(xx,yy)){ris[xx][yy]=1;return true;}else{return false;}
}
int main(){ios::sync_with_stdio(false);mpp['W']=0;mpp['A']=1;mpp['S']=2;mpp['D']=3;cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>mp[i][j];}}int ans=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){vis[i][j]=1;if(dfs(i,j)){ans++;}vis[i][j]=0;}}cout<<ans<<endl;return 0;
}

H.小明拿宝藏

改编自01背包模板。
加了一个条件,必须拿第一件物品。
只需要在最初时读入这件物品,减掉相应的背包容量,后续假装这件物品不存在即可。
01背包:
二维即可过题。
dp[i][j] 表示第 i 件物品,在背包容量还剩 j 的大小时,承放的最大价值。
第一维循环物品,第二维循环背包容量。
一维要倒叙第二重循环,因为这样背包容量<=j中的状态还是i-1的状态。

如果背包装得下当前的物体,在遍历过程中分别计算第i件物体放入和不放入背包的价值,取其中大的作为当前的最大价值。
如果背包装不下当前物体那么第i个物体只有不放入背包一种选择。

不放入背包时:第 iii 次决策后的最大价值和第 i−1i-1i−1 次决策时候的价值是一样的(还是原来的那些物体,没多没少)。
放入背包时:第 iii 次决策后的价值为 第 i−1i-1i−1 次决策时候的价值加上当前物体的价值v[j]。物体放入背包后会使背包容量变为 jjj ,即没放物体之前背包的容量为j - w[i]

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int dp[N];
int v[N],w[N];
int n,m;
int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];m-=v[1];for(int i=2;i<=n;i++){for(int j=m;j>=v[i];j--){dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}}cout<<dp[m]+w[1]<<endl;return 0;
}

I.小明的考试成绩

我又填了一道简单题。
好像前面又难了。
这道题就是考察排序的题目,就算冒泡也能通过。
只是用二维数组的方式给你,只需要把给定的所有数字存下,特别的记录一下小明所在位置的成绩,然后排序,排好序后降序找到小明的成绩所在的位置的下标,即为小明的成绩。

#include<bits/stdc++.h>
using namespace std;
vector<int> ve;
bool cmp(int x,int y){return x>y;
}
int main(){int n,m;int x,y,k,w;cin>>n>>m;cin>>x>>y;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>k;ve.push_back(k);if(i==x&&j==y) w=k;}}sort(ve.begin(),ve.end(),cmp);for(int i=0;i<n*m;i++){if(ve[i]==w){cout<<i+1<<endl;break;}}return 0;
}

J.小明与鲜花

考察的容斥原理应用。
因为黑盒数据简单,多重背包也可以做。
因为黑盒数据简单,乱做也有可能过。
正解如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int down;
ll n,m;
ll a[22];
int qpow(int a,int b){int res=1;while(b){if(b&1) res=1LL*res*a%mod;a=1LL*a*a%mod;b>>=1;}return res;
}
int C(ll a,ll b){if(a<b) return 0;int up=1;for(ll i=a;i>a-b;i--) up=i%mod*up%mod;return 1LL*up*down%mod;
}
int main(){cin>>n>>m;for(int i=0;i<n;i++){cin>>a[i];}down=1;for(int i=1;i<=n-1;i++) down=1LL*i%mod*down%mod;down=qpow(down,mod-2)%mod;int res=0;for(int i=0;i<(1<<n);i++){ll d=m+n-1;int flag=1;for(int j=0;j<n;j++){if((i>>j)&1){flag*=-1;d-=(a[j]+1);}}res=(res+flag*C(d,n-1))%mod;}cout<<(res+mod)%mod;return 0;
}

K.小明与小红的增删图游戏

无详解,我预判本题没人过题。
虽然我数据出的太弱了,如果能理解到答案只在 0,1,2{0,1,2}0,1,2 中产生,也可以用随机数过题,反正就三组数据,随机输出 0,1,2{0,1,2}0,1,2 多交几遍,脸好就过题了。
正经解题方法为:Dijkstra判断最小环,如果最小环的权值和小于 ccc , 那么就可以买一个环,因为一次只能删一个无环图,所以输出 2 ;如果最小环权值大于等于 ccc , 或者没法形成环,输出 1 ;如果小明啥也没买,输出 0 .

#include<bits/stdc++.h>
using namespace std;
const int N=2050,M=5050;
const int INF=0x3f3f3f3f;
int head[N],top;
struct node{int to,next;int val;
}edge[M];
int d[N][N],cnt;
int n,m,c;
int vis[M];
priority_queue<pair<int,int> > q;
void init(){memset(head,-1,sizeof(head));top=0;
}
void add(int u,int v,int w){edge[top].to=v;edge[top].next=head[u];edge[top].val=w;head[u]=top++;
}
void dijkstra(int start){memset(vis,0,sizeof(vis));d[start][start]=0;q.push(make_pair(0,start));while(!q.empty()){auto temp=q.top();int x=temp.second;q.pop();if(vis[x]) continue;vis[x]=1;for(int i=head[x];~i;i=edge[i].next){int y=edge[i].to;int z=edge[i].val;if(d[start][y]>d[start][x]+z){d[start][y]=d[start][x]+z;q.push(make_pair(-d[start][y],y));}}}
}
int main(){memset(d,INF,sizeof(d));init();int n,m,c;cin>>n>>m>>c;for(int i=1;i<=m;i++){int x,y,z;cin>>x>>y>>z;if(z<=c){add(x,y,z);cnt++;}}int minn=INF;for(int i=1;i<=n;i++){dijkstra(i);}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i!=j) minn=min(d[i][j]+d[j][i],minn);}}if(cnt==0) cout<<0<<endl;else{if(minn<=c) cout<<2<<endl;else cout<<1<<endl;}
}

后记

出签到题以及两道模板题 (01背包模板、容斥原理模板) 外所有题目都是codeforce上的原题改编以及acm比赛原题改编,也是我上一段时间比赛时做过的题目,所有的题目,在正式比赛中均属于签到题,希望大家可以将后面的题慢慢了解和补掉,对算法产生更多的兴趣。
学算法,可以提高自己的码力。
如果足够努力和幸运的话,可能摸到一个足够有含金量的奖牌吧。

记录一下我编数据的过程,对着别人的编,然后自己编,写配置文件,写题面。最后的最后,如果您是个大佬,联系我,带带我。带带我。带带我。

【桂林信息科技学院第一届程序设计大赛】完整题解 C++相关推荐

  1. 中学生python程序设计大赛_贵州民族大学第一届程序设计大赛圆满举办

    原标题:贵州民族大学第一届程序设计大赛圆满举办 为了推动和促进计算机程序设计艺术在校园内的推广与普及,提高同学们的逻辑分析能力.学习编程的兴趣.学生的创造力.团队合作精神以及实际动手能力,特举办贵州民 ...

  2. 中南林科大软件协会第一届程序设计大赛作品报告

    软件协会第一届程序设计大赛 作品名称: 中南林业科技大学人员出入校管理系统 作 者: *** 填写日期: 2022.05.26 目  录 第二章 概要设计 第三章 详细设计 第四章 测试报告 第五章 ...

  3. QDU第一届程序设计大赛——E到I题解法(非官方题解)

    题目链接https://qduoj.com/contest/28/problems,密码:qdu1230 E题: 思路:先进行排序,然后去暴力模拟就可以,但可能WA了几次,导致此题没解出来,有点可惜 ...

  4. SWPUACM第一届程序设计大赛

    文章目录 A 简单的字符串处理 B 多米诺骨牌 C 翻转棋 D 多次方程求解 E 约瑟夫升级 F 字符画打印,很简单哒 G 黄金矿工 H 天之杯 A 简单的字符串处理 TimeLimit: 1000m ...

  5. 江苏大学2021年第一届程序设计大赛(UJSCPC)题面

    目录 A. 校门外的树 问题描述 输入形式 输出形式 样例输入 样例输出 B. 合格的素数 问题描述 输入形式 输出形式 样例输入 样例输出 C. 高精度乘法 问题描述 输入形式 输出形式 样例输入 ...

  6. 湘南学院第一届程序设计大赛题解(XNPC—2022)

    题解目录 A.你的马蹄铁是在另一只蹄子上吗? 题目大意: 题解: 代码: B.判断奇因子 题目大意: 题解: 代码: C.死亡祝福 题目大意: 题解: 代码: D.奇怪的方程式 题目大意: 题解: 代 ...

  7. NUIST第一届程序设计大赛团队赛试题

    A. 负鼠的追求者 题目描述 负鼠有一个讨厌的追求者,一直紧跟在她后面. 已知负鼠在位置x,它的追求者在位置p,其中1 ≤ p ≤ x.由于负鼠很讨厌这个追求者,所以只有他们所处位置互质的时候,负鼠才 ...

  8. NUIST第一届程序设计大赛团队赛题解

    本次比赛,AK两题为签到题, 文章目录 A. 负鼠的追求者 解法1 解法2 B. Game 解法1 解法2 C. 犯困的负鼠 D. 天天爱跑步 E. 愉快的负鼠 F. Relative Molecul ...

  9. “九韶杯”河科院程序设计协会第一届程序设计竞赛 部分题解

    (大型翻车 A 602 #include<bits/stdc++.h> using namespace std; int main(){int sum=0;for(int i=6;i< ...

最新文章

  1. vector 指针 的指针
  2. Pycharm断点失效(不起作用),原来是matplotlib.pyplot.show()函数的原因
  3. Struts文件上传与下载详解_上传单个文件
  4. docker内程序如何读取dockerfile和compose.yml中设置的环境变量
  5. boost::weak_ptr和enable_shared_from_this
  6. 广州大学计算机科学与技术学科评估,省名牌专业评估专家评估我校计算机科学与技术专业...
  7. FFMpeg,SDL编译 No avaiable video device
  8. 在苹果Mac中如何将html网页转成PDF文件?
  9. 太极熊猫3服务器维护中,太极熊猫3月10日维护公告_瑞兽稀有技修改_蚕豆网新闻...
  10. 关于LED限流电阻计算的那些事儿
  11. 2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版!!!!!
  12. Taq DNA聚合酶的种类与应用现状
  13. Msg 547 The ALTER TABLE statement conflicted with the CHECK constraint .
  14. Python 乘法口诀
  15. 如何让计算机桌面自动更换,怎么让电脑自动更换桌面背景
  16. 什么是LHS查询和RHS查询
  17. 数学建模之马尔萨斯模型(入门版)
  18. 2019.3.8 提高B组 T2 JZOJ 3055 比赛
  19. 2008年威客网站发展观察(排名分析)
  20. 浅显易懂认识23种设计模式

热门文章

  1. c语言经典程序100例 九宫格,9X9,九宫格测试,C编程。
  2. 论文阅读笔记:(2021.06, cvpr) Monocular 3D Object Detection: An Extrinsic Parameter Free Approach
  3. 【JS 逆向百例】层层嵌套!某加速商城 RSA 加密
  4. 安装 torch-scatter,torch-sparse 出现error: Command errored out with exit status 1
  5. DHCP简单拓扑图演示
  6. 使用Snake代理跳板
  7. python支付宝蚂蚁森林_Python数据可视化-支付宝蚂蚁森林能量收取记录
  8. 如何发现异常商业数据?达摩院用这套算法
  9. python画旺仔代码_Python基础3
  10. 北邮网络安全-防火墙