其实吧对于码蹄杯省赛的话,第三场是一千五百多人,百分之25的获奖率,然后前四百名左右就可以获奖,根据排行来看大概是六题左右,其中大概就四题要点脑子,其余的基本上属于语法题,也就是13题中如果语法没问题的话,九题是很轻松的,因为都是青铜白银题,语法没问题的话就OK的,然后就是一个P序列,一个打工人,一个搜索题和一个纯恶心的模拟题(骂骂咧咧)有点麻烦,最后也是C了12题,模拟题没写,烦的让人头痛,后面也是补题了,然后下面是所有题目的题解。
第一题:神秘仪式
其实就是比大小没那么多花里胡哨,三个数字比大小,第一个和第二个的和大于第三个就输出yes否则输出no。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
int a,b,c;
cin>>a>>b>>c;
if(a+b>c){
cout<<"yes";
}else{
cout<<"no";
}
return 0;
}
第二题:小码哥的式子
这题的话其实就是若干组三个数,对于每组三个数输出a*b%c的值就行,不过要注意的一点是数据范围是1e5,最好是开long long稳妥点。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
long long a,b,c;
while(cin>>a>>b>>c){
cout<<(long long)a*b%c<<endl;
}
return 0;
}
第三题:都市路径
一个有向图,到所有的地方的最短路,最短路问题用BFS解决,注意的是到不了的地方输出-1即可。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=105;
int n;
vector<vector<int>>ans(N,vector<int>(N,0));
void bfs(int t){
queue<int> q;
q.push(t);
vector<int>cnt(N);
for(int i=1;i<=n;i++){
cnt[i]=-1;
}
cnt[t]=0;
while(!q.empty()){
int p=q.front();
q.pop();
for(int j=1;j<=n;j++){
if(ans[p][j]==0||cnt[j]!=-1){
continue;
}else{
cnt[j]=cnt[p]+1;
q.push(j);
}
}
}
for(int i=1;i<=n;i++){
cout<<i<<" "<<((cnt[i]==-1)?(-1):(cnt[i]))<<endl;;
}
}
int main()
{
fast
//simeple
cin>>n;
int u,k,v;
for(int i=1;i<=n;i++){
cin>>u>>k;
while(k--){
cin>>v;
ans[u][v]=1;
}
}
bfs(1);
return 0;
}
第四题:奇怪的数
一个循环从1到n,同时把每个数的每位拆开,加起来为10就是符合条件的,记录总数即可。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
bool go(int n){
int cnt=0;
while(n){
cnt=cnt+n%10;
n=n/10;
}
return ((cnt==10)?true:false);
}
int main()
{
fast
//simeple
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++){
if(go(i)){
sum++;
}
}
cout<<sum;
return 0;
}
第五题:打工人
这题当时其实卡了我挺久的,当时是公式写的,但是wa了,当时没找到bug,然后换了方法写,后面才发现是溢出了(当时也没想到这题是最难的),这题的话就是说第一天可以工作1个任务,然后第二天开始后续两天可以工作2个任务(也就是1,2,2),第四天开始后面连续三天工作3个任务,此时也就是(1,2,2,3,3,3)以此类推,然后会问你从某天开始到某天,一共工作了多少任务。
下面详讲一波。
- 第一步:找到每天数属于哪个阶段
找到满足的最小k值,可以直接暴力过去逐步累加得到。
- 第二步:计算每个阶段内的任务总数
对于每个阶段,从起点天数到终点天数,每天完成的任务数是固定的。
- 第三步:累加 [L, R] 范围内的任务总数
从 L 到 R,分别计算经过的每个阶段完成的任务数并累加。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// 找到给定天数 day 属于哪个阶段
int find_day(int day) {
int s = 1;
int days_sum = 1;
while (days_sum < day) {
s++;
days_sum += s;
}
return s;
}
// 计算从 start 到 end 的任务总数,假设都在同一个阶段
long long sum_day(int start, int end, int day) {
return (end - start + 1) * day;
}
// 计算区间 [L, R] 内完成的任务总数
long long sum(int L, int R) {
long long t = 0;
int k = L;
while (k <= R) {
int s = find_day(k); // 当前天数属于哪个阶段
int mid = s * (s - 1) / 2 + 1;
int mid2 = s * (s + 1) / 2;
// 计算当前阶段的可计算区间
int end = min(mid2, R);
t += sum_day(k, end, s);
k = end + 1;
}
return t;
}
int main()
{
fast
//simeple
int q;
cin >> q;
vector<pair<int, int>> ans(q);
for (int i = 0; i < q; ++i) {
int L, R;
cin >> L >> R;
ans[i] = {L, R};
}
for (const auto& i : ans) {
int L = i.first;
int R = i.second;
cout << sum(L, R) << endl;
}
return 0;
}
第六题:简单的进制转换
输入是给你一个25位的二进制数字,用字符串类型读入就好,然后将其转换成10进制,用string类型进行储存,然后从后面开始推,用一个cnt记录,每次得到的就是(str[i]-'0')*pow(2,k++)然后加起来输出即可。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
string str;
cin>>str;
int k=0;
int cnt=0;
for(int i=str.size()-1;i>=0;i--){
cnt=cnt+(str[i]-'0')*pow(2,k++);
}
cout<<cnt;
return 0;
}
第七题:时间转换
这题的意思是给一个n(秒数),然后输出这个秒数转换成几小时几分钟几秒的类型(00:00:00),然后输出即可,也就是对3600除得到小时然后再对于n取模得到剩余的时间,然后对于60除一次之后得到分钟再取模之后,输出即可。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
int n;
cin>>n;
cout<<n/3600<<":"<<n%3600/60<<":"<<n%3600%60;
return 0;
}
第八题:P序列
这题的话可能是算最难的,因为我个人感觉很难想到,首先要了解非严格递增,非严格递减以及先非严格递增再非严格递减是个什么情况。
- 非严格递增(比如 1, 2, 2, 3)。
- 非严格递减(比如 3, 2, 2, 1)。
- 先非严格递增再非严格递减(比如 1, 2, 2, 3, 2, 1)
后面其实会发现,其实这题就公式找规律,找到最大的数,记录每个数出现了多少次,然后设置一个总数为sum初始值为1,因为最少出现1次,然后循环一次sum*每个数出现的x+1次即可(注:不遍历最大的数,遍历到最大的数前一个),要开longlong因为相乘的话会溢出int。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MOD=998244353;
ll cnt=INT_MIN;
int main()
{
fast
//simeple
int n;
cin>>n;
vector<int>ans(1e7+5);
for(int i=0;i<n;i++){
ll x;
cin>>x;
ans[x]++;
cnt=max(x,cnt);
}
ll sum=1;
for(int i=0;i<cnt;i++){
if(ans[i]){
sum=sum*(ans[i]+1)%MOD;
}
}
cout<<sum;
return 0;
}
第九题:迷宫的秘密
这题的话题目很差,但其实就是唬人的,题意就是说一串数字,不会出现在开始和结尾同时满足他比他左边的数和右边的数大,输出即可,那么一个数组装到数字,然后从1开始遍历到n-1去判断即可。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
int n;
cin>>n;
vector<int>ans(n);
for(int i=0;i<n;i++){
cin>>ans[i];
}
for(int i=1;i<n-1;i++){
if(ans[i]>ans[i-1]&&ans[i]>ans[i+1]){
cout<<ans[i]<<endl;
}
}
return 0;
}
第十题:灵异空间
这题就是,给一个n大小的数组,m次操作,每次两个数x,y,反转从x开到到y的数的位置即可,每次遍历一遍就行,从x遍历到y,swap交换,如果说x大于y就得结束。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
int n,m;
cin>>n>>m;
vector<int>ans(n);
for(int i=0;i<n;i++){
cin>>ans[i];
}
while(m--){
int x,y;
cin>>x>>y;
for(int i=x-1,j=y-1;i<j;i++,j--){
swap(ans[i],ans[j]);
}
}
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
return 0;
}
第十一题:寻找质因子
这题的话其实是不难的,主要是要知道质因子的概念。
质因子:质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。 除了1以外,两个没有其他共同质因子的正整数称为互质。 因为1没有质因子,1与任何正整数(包括1本身)都是互质。 正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。
知道了就很好写了。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
int n;
cin>>n;
for(int i=2;i<=n;i++){
while(n!=i){ //若i=n,则质因数就是n本身
if(n%i==0) //若i是质因数,则打印出i的值,并用商给n赋新值
{
cout<<i<<endl;//符合就输出
n=n/i;
}
else break;//若不能被i整除,则算下一个i
}
}
cout<<n<<endl; //这里是打印最后一个质因数,也就是等于i时的那个
return 0;
}
第十二题:多项式输入
这题是让我感觉最恶心的,难度不高一个循环然后if判断即可,但是太麻烦了,纯模拟浪费时间的题,所以当时没写,这题的话注意的情况比较多,符号问题以及一些系数或者指数=0的时候即可。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
string slove(int n, vector<int>& ans) {
stringstream ss;
bool go = true; // 用于判断是否是第一个输出的项
for (int i = 0; i <= n; ++i) {
int q = ans[i];
int p = n - i;
if (q != 0) {
if (go) {
// 处理第一个项的符号
if (q < 0) {
ss << "-";
}
go = false;
} else {
// 处理非第一个项的符号
if (q > 0) {
ss << "+";
} else {
ss << "-";
}
}
// 处理系数的绝对值
if (abs(q) != 1 || p == 0) {
ss << abs(q);
}
// 处理指数部分
if (p > 0) {
ss << "x";
if (p > 1) {
ss << "^" << p;
}
}
}
}
return ss.str();
}
int main()
{
fast
//simeple
int n;
cin >> n;
vector<int> ans(n + 1);
for (int i = 0; i <= n; ++i) {
cin >> ans[i];
}
string count = slove(n, ans);
cout << count << endl;
return 0;
}
第十三题:出去玩
这题的话其实就是四个数,第一个和第三个取个最小值,第二个和第四个取个最小值,然后两个最小值相加输出即可,这个的话开longlong是最好,因为两个1e9相加保守点开long long。
#include <bits/stdc++.h>
#define simeple freopen("input", "r", stdin),freopen("output", "w", stdout);
#define fast ios::sync_with_stdio(false),cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
fast
//simeple
int a,b,c,d;
cin>>a>>b>>c>>d;
cout<<(long long)(min(a,c)+min(b,d));
return 0;
}
这场下来的话难度排行应该是第八题p序列,然后是第五题打工人,接着是第三题都市路径最后是第十二题多项式(骂骂咧咧),个人任务除了这四题其他的题目应该是如果语法没问题都ok的。
标签:typedef,int,题解,cin,long,初赛,freopen,职高,define From: https://blog.csdn.net/m0_73147661/article/details/140237785