B题:

题目背景

【 题目背景和题目描述的两个题面是完全等价的,您可以选择阅读其中一部分。】

专攻超统一物理学的莲子,对机械结构的运动颇有了解。如下图所示,是一个三进制加法计算器的(超简化)示意图。

初始时齿轮的状态如上。

把第一个齿轮拨动一个单位长度,变为如上图所示。

题解:

模拟题。按照题目要求输入整数 a,b,模拟这个奇怪的进位规则即可。

参考代码 

 版本 1:

#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 2147483647;
int qread(){int w=1,c,ret;while((c = getchar()) >  '9' || c <  '0') w = (c == '-' ? -1 : 1); ret = c - '0';while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';return ret * w;
}
const int MAXN = 2e5 + 3;
int A[MAXN], B[MAXN];
int main(){int n = qread(), m = qread(), l = max(n, m);dn(n, 1, i) A[i] = qread();dn(m, 1, i) B[i] = qread();up(1, l, i) A[i] += B[i], A[i + 1] += A[i] / (i + 1), A[i] %= i + 1;if(A[l + 1]) ++ l;dn(l, 1, i) printf("%d%c", A[i], " \n"[i == 1]);return 0;
}

版本2:

#include <bits/stdc++.h>
using namespace std;
int a[200050],b[200050];
int main()
{auto read=([&]{int x;cin >> x;return x;});int n=read(),m=read();int len=max(n,m)+1;generate_n(a+1,n,read);generate_n(b+1,m,read);reverse(a+1,a+n+1);reverse(b+1,b+m+1);for (int i=1;i<=len;i++){a[i]+=b[i];a[i+1]+=(a[i]/(i+1));a[i]%=(i+1);}while (a[len]==0 && len>1)len--;reverse(a+1,a+len+1);for (int i=1;i<=len;i++)cout << a[i] << " ";return 0;
}

版本3:

import java.util.Scanner;public class Main {public static int[] a = new int[200005];public static int[] b = new int[200005];public static int[] c = new int[200005];public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(), m = scanner.nextInt();int maxLength = Math.max(n, m);for (int i = (maxLength - n) + 1; i <= maxLength; ++i)a[i] = scanner.nextInt();for (int i = (maxLength - m) + 1; i <= maxLength; ++i)b[i] = scanner.nextInt();for (int i = maxLength, cnt = 2; i > 0; --i, ++cnt) {c[i] += a[i] + b[i];if (c[i] >= cnt) {c[i] -= cnt;c[i - 1] += 1;}}if (c[0] > 0) {System.out.printf("%d ", c[0]);}for (int i = 1; i <= maxLength; ++i) {System.out.printf("%d ", c[i]);}System.out.println();}
}

C题

题目背景

你现在不能休息,周围有 deadline 在游荡。

莲子正在赶自己的程序设计作业。除了完成程序代码的编写,对提交上去的作业进行排版以对助教留下良好印象同样重要。

而众所周知,文章里面的代码和一些特殊性质的文本是要附上行号的,然而它们的篇幅往往都很长,手动去加容易出现失误。因此,莲子决定自力更生造轮子,写一个行号生成器。

输入格式

输入包含若干行,为原始的文本文件。

输出格式

输出包含若干行,为加上行号后的文本文件。

输入输出样例

题解:

参考代码

版本1:

#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 2147483647;
const int MAXN= 2e4 + 3;
char S[MAXN], c; int l, m;
int main(){m = count(S + 1 , S + 1 + fread(S + 1, 1, MAXN, stdin), '\n');int s = log10(m) + 1 + 1e-9, p = 0;up(1, m, i){int t = log10(i) + 1 + 1e-9;for(int j = 1;j <= s - t;++ j) putchar( ' '); printf("%d ", i);for(p = p + 1;S[p] != 10;++ p) putchar(S[p]); putchar('\n');}return 0;
}

版本2:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
char buf[200050];
vector <char> s[200050];
int cnt;
int get_digit(int x)
{int digit=1,ret=1;while (ret<=x){digit++;ret*=10;}return digit;
}
int main()
{while(fgets(buf,200000,stdin)!=NULL){cnt++;for (int i=0;buf[i]!='\n';i++)s[cnt].push_back(buf[i]);}int cnt_digit=get_digit(cnt);for (int i=1;i<=cnt;i++){for (int j=1;j<=cnt_digit-get_digit(i);j++)putchar(' ');cout << i << ' ';for (int j=0;j<s[i].size();j++)putchar(s[i][j]);putchar('\n');}return 0;
}

版本3:

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;public class Main {public static List<String> list = new ArrayList<>();public static int getBit(int x) {int cnt = 0;while (x > 0) {x /= 10;++cnt;}return cnt;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNextLine()) {list.add(scanner.nextLine());}int size = list.size();int len = getBit(size);for (int i = 0; i < size; ++i) {System.out.printf("%" + len + "d %s\n", i + 1, list.get(i));}}
}

D题

题目背景

莲子正在研究分子的运动。

每个分子都有一个速度,约定正方向为正,负方向为负。分子的数量极多,速度又并不一致,看上去杂乱无章。于是莲子希望调整部分分子的速度,使得最终分子们看上去整齐。

题解:

参考代码

版本1:

#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 2147483647;
int qread(){int w=1,c,ret;while((c = getchar()) >  '9' || c <  '0') w = (c == '-' ? -1 : 1); ret = c - '0';while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';return ret * w;
}
const int MAXN = 1e5 + 3;
int A[MAXN], ans = INF;
int main(){int n = qread(), m = qread();up(1, n, i) A[i] = qread();sort(A + 1, A + 1 + n);int j = 1;up(1, min(n, m + 1), i){j = max(i, j);while((i - 1) + (n - j) + min(i - 1, n - j) > m) ++ j;ans = min(ans, A[j] - A[i]);}printf("%d\n", ans);return 0;
}

版本2:

import java.util.Scanner;
import java.util.Arrays;public class Main {public static int[] a = new int[100005];public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt(), m = scanner.nextInt();for (int i = 1; i <= n; ++i)a[i] = scanner.nextInt();Arrays.sort(a, 1, n + 1);int j = 1, ans = Integer.MAX_VALUE;for (int i = 1; i <= Math.min(n, m + 1); ++i) {j = Math.max(j, i);while((i - 1) + (n - j) + Math.min(i - 1, n - j) > m) ++j;ans = Math.min(ans, a[j] - a[i]);}System.out.println(ans);}
}

F题

作为大学生,莲子和梅莉有着比高中时更为闲暇的课余时光。在没有课的时候,她们喜欢玩大富翁这一游戏,在游玩过程中交流自己的喜怒哀乐。

输入输出样例

题解

模拟题。没什么好说的。这里就讲几个细节:

参考代码

 版本1:

#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 2147483647;
int qread(){int w=1,c,ret;while((c = getchar()) >  '9' || c <  '0') w = (c == '-' ? -1 : 1); ret = c - '0';while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';return ret * w;
}
int n, m, q, maxl; bool o = 1;
const int MAXN = 100 + 3;
int C[MAXN][MAXN], A[MAXN], D[MAXN], L[MAXN], O[3], T[MAXN];
i64 M[2];
int main(){n = qread(), m = qread(), q = qread(), maxl = qread();M[0] = M[1] = m, O[0] = O[1] = 1;up(1, n, i) L[i] = 0, T[i] = -1;up(1, n, i)up(0, maxl - 1, j) C[i][j] = qread();up(1, n, i) D[i] = qread();for(int op, k;~scanf("%d%d", &op, &k);){if(op == 1){if(o == 1){up(1, n, i) if(T[i] != -1) M[T[i]] += D[i];}o ^= 1;up(1, k, i){O[o] = (O[o]) % n + 1;int p = O[o];if(T[p] ==  o) M[o] += A[p]; else if(T[p] == !o){M[!o] += A[p], M[o] -= A[p];if(M[o] < 0)puts(o ? "Merry" : "Renko"), exit(0);}}} else {int p = O[o];while(k && L[p] < maxl && M[o] >= C[p][L[p]] && T[p] != !o){A[p] += C[p][L[p]], M[o] -= C[p][L[p]];++ L[p], T[p] = o, -- k;}}}up(1, n, i) if(T[i] != -1) M[T[i]] += D[i];printf("%lld %lld\n", M[0], M[1]);return 0;
}

版本2:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <queue>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}return x*f;
}int n,m,q,L,C[105][105],d[105],a[105],lv[105],pos[2],belong[105];long long money[2];const string name[2]={"Renko","Merry"};inline void putfail(int id)
{cout << name[id] << endl;exit(0);
}inline void forward(int id,int k)
{for (int i=1;i<=k;i++){int &p=pos[id];p++;if (p>n)p-=n;if (belong[p]==id)money[id]+=a[p];else if (belong[p]==(id^1)){money[id]-=a[p];money[id^1]+=a[p];}if (money[id]<0)putfail(id);}
}inline void build(int id,int k)
{int p=pos[id],cost=C[p][lv[p]];for (int i=1;(money[id]>=cost && lv[p]<L && (belong[p]==-1 || belong[p]==id) && i<=k);i++){belong[p]=id;money[id]-=cost;a[p]+=cost;cost=C[p][++lv[p]];}
}int main()
{n=read(),m=read(),q=read(),L=read();for (int i=1;i<=n;i++){for (int j=0;j<L;j++)C[i][j]=read();}for (int i=1;i<=n;i++)d[i]=read();pos[0]=pos[1]=1;fill(belong+1,belong+n+1,-1);money[0]=money[1]=m;for (int i=0;i<2*q;i++){int op=read();begin:for (int j=1;j<=n && !(i&1);j++){if (belong[j]==0)money[0]+=d[j];else if (belong[j]==1)money[1]+=d[j];}int k=read();forward(i&1,k);if (i==2*q-1)break;op=read();if (op==1){i++;goto begin;}else{k=read();build(i&1,k);}}for (int j=1;j<=n;j++){if (belong[j]==0)money[0]+=d[j];else if (belong[j]==1)money[1]+=d[j];}cout << money[0] << " " << money[1] << endl;return 0;
}

G题

题目背景

梅莉买到了一张特殊的带有花纹的纸。整张纸的图案可以视为,由一个较小的图案,沿着横向与纵向无限循环而成。同时,这个基本图案部分透明,部分不透明。

于是,如果将这张纸覆盖在书本上,那么一些字可以被看见,另一些字看不见。

莲子突发奇想:假使她制作一张很大很大的数表,将花纹纸覆盖在上面,那么就会有很多数字被遮挡。那些没有被遮挡的数字的和是多少呢?

题目描述

 

 

题解:

 参考代码:

#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 2147483647;
int n, m, r, c, q;
int qread(){int w=1,c,ret;while((c = getchar()) >  '9' || c <  '0') w = (c == '-' ? -1 : 1); ret = c - '0';while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';return ret * w;
}
const int MAXN = 2e3 + 3;
const int MAXM =  50 + 3;
const int MOD  = 998244353;
int A[MAXN][MAXN], S[MAXN][MAXN]; bool B[MAXN][MAXN];
int calc(int a1, int b1, int a2, int b2){int ret = S[a2][b2];if(a1 > r) ret = (ret - S[a1 - r][b2] + MOD) % MOD;if(b1 > c) ret = (ret - S[a2][b1 - c] + MOD) % MOD;if(a1 > r && b1 > c) ret = (ret + S[a1 - r][b1 - c]) % MOD;return ret;
}
int main(){n = qread(), m = qread();up(1, n, i) up(1, m, j) A[i][j] = qread();r = qread(), c = qread();up(1, r, i) up(1, c, j) B[i][j] = qread();up(1, n, i) up(1, m, j){S[i][j] = A[i][j];if(i > r) S[i][j] = (S[i][j] + S[i - r][j]) % MOD;if(j > c) S[i][j] = (S[i][j] + S[i][j - c]) % MOD;if(i > r && j > c)S[i][j] = (S[i][j] - S[i - r][j - c] + MOD) % MOD;}q = qread();up(1, q, i){int _x1 = qread(), _y1 = qread();int _x2 = qread(), _y2 = qread();int ans = 0;up(1, min(r, _x2 - _x1 + 1), a)up(1, min(c, _y2 - _y1 + 1), b) if(B[a][b] == 0){int a1 = _x1 + a - 1, a2 = a1 + (_x2 - a1) / r * r;int b1 = _y1 + b - 1, b2 = b1 + (_y2 - b1) / c * c;ans = (ans + calc(a1, b1, a2, b2)) % MOD;}printf("%d\n", ans);}return 0;
}

I题

学校正在组织宴会。

莲子和梅莉发现,学校的结构十分复杂。学生之间存在着部门与上司的关系。每一个部门内部,都呈现出连成一条线的上司关系。一个部门内等级最高的学生,又可能受限于另外某个部门内的某个学生。

莲子和梅莉同样参加了宴会。但是她们对参加学生有自己的评判。例如,她对某些部门比较喜欢,对另一些部门则不感兴趣。同时对位居不同等级的学生同样有着不同的看法。

正如某个经典问题所描述的一样,每个学生都不希望与自己的直接上司共同参加宴会。

梅莉想要知道,最好情况下,有多少个参加宴会的学生是她喜欢的。

题目描述

 

 题解:

压轴题。

参考代码

#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const i64 INF = 1e18;
int n;
int qread(){int w=1,c,ret;while((c = getchar()) >  '9' || c <  '0') w = (c == '-' ? -1 : 1); ret = c - '0';while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';return ret * w;
}
const int MAXN = 1e6 + 3;
const int MAXM = 2e6 + 3;
int R[MAXN], C[MAXN], A[MAXN], F[MAXN], G[MAXM], W[MAXM], o = 0;
int X[MAXM]; i64 U[MAXM][4];
int Y[MAXM]; i64 V[MAXM][4];
int P0[MAXN], Q0[MAXN], P1[MAXN], Q1[MAXN];
int value(int w){return w % 2 == 1 ? w / 2 + 1 : w / 2;}
void calc(int l, int r, i64 &w, bool t){    // [l, r] 区间if(r - l + 1 ==  0){w = 0   ; return;}if(r - l + 1 == -1){w = 0   ; return;}if(r - l + 1 == -2){w = -INF; return;}if(t == false){int u = min(Q0[l], r); w = P0[r] - P0[u] + ( R[l] == 1 ? value(u - l + 1) : 0);} else {int u = min(Q1[l], r); w = P1[r] - P1[u] + (!R[l] == 1 ? value(u - l + 1) : 0);}
}
void calc(int l, int r, i64 O[4], bool t){  // [l + (0~1), r - (0~1)] 区间calc(l    , r    , O[0b11], t);calc(l    , r - 1, O[0b10], t);calc(l + 1, r    , O[0b01], t);calc(l + 1, r - 1, O[0b00], t);
}
i64 I[MAXM], J[MAXM];   // I 是必须选上,J 是必须不选
void dfs(int u){if(X[u] == 0) I[u] = W[u], J[u] = 0; else {int l = X[u], r = Y[u]; dfs(l), dfs(r);I[u] = W[u]+ max(U[u][0b00] + I[l], U[u][0b01] + J[l])+ max(V[u][0b00] + I[r], V[u][0b01] + J[r]);J[u] =+ max(U[u][0b10] + I[l], U[u][0b11] + J[l])+ max(V[u][0b10] + I[r], V[u][0b11] + J[r]);}
}
int main(){ n = qread();up(1, n, i) R[i] = qread();up(1, n, i) C[i] = qread();up(2, n, i) A[i] = qread();P0[1] = R[1], P1[1] = !R[1];up(2, n, i){P0[i] = max(P0[i - 1], P0[i - 2] +  R[i]);P1[i] = max(P1[i - 1], P1[i - 2] + !R[i]);}Q0[n] = Q1[n] = n;dn(n - 1, 1, i){if( R[i] == 0) Q0[i] = i; elseif( R[i + 1] == 0) Q0[i] = i; else Q0[i] = Q0[i + 1];if(!R[i] == 0) Q1[i] = i; elseif(!R[i + 1] == 0) Q1[i] = i; else Q1[i] = Q1[i + 1];}up(1, n - 1, i){int t = A[i + 1], f = F[t]; // (i, t) 是特殊点F[t] = F[i + 1] = ++ o;     // 给特殊点分配编号if(f)if(X[f]) Y[f] = o, calc(G[f] + 1, i - 1, V[f], C[t]);else     X[f] = o, calc(G[f] + 1, i - 1, U[f], C[t]);W[o] = R[i] ^ C[t], G[o] = i;}up(1, n, i){    // 最后一层都是特殊点int t = i, f = F[t]; ++ o, W[o] = R[n] ^ C[i];if(f)if(X[f]) Y[f] = o, calc(G[f] + 1, n - 1, V[f], C[t]);else     X[f] = o, calc(G[f] + 1, n - 1, U[f], C[t]);}dfs(1); printf("%lld\n", max(I[1], J[1]));return 0;
}

第五届传智杯-初赛【A组-题解】相关推荐

  1. 第四届“传智杯”初赛B组题解

    文章目录 前言 A.组成成绩 题目描述 输入格式 输出格式 输入输出样例 输入 #1 B.报告赋分 题目描述 输入格式 输出格式 输入输出样例 C.竞争得分 题目描述 输入格式 输出格式 输入输出样例 ...

  2. 第五届传智杯 | 初赛 | python 解法思路复盘

    文章目录 A-莲子的软件工程学 题目描述 输入格式 输出格式 样例 我的思路 源代码 B-莲子的机械动力学 题目描述 输入格式 输出格式 样例 我的思路 源代码 E-梅莉的市场经济学 题目描述 输入格 ...

  3. 第五届传智杯-初赛【B组-题解】

    A题 题目背景 在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了. 对于一名理科生来说,各种软件在学习和研究中是非常重要的.为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么 ...

  4. 第四届传智杯(初赛B组) | python题解思路

    目录 A 组原成绩 B 报告赋分 C 竞争得分 D 小卡与质数2 E 萝卜数据库 总的来说,比练习赛还简单..... python运行时间排名不占优势 A 组原成绩 题解: t,h,e = map(i ...

  5. 第五届“传智杯”全国大学生计算机大赛(练习赛)前四题题解

    第五届"传智杯"全国大学生计算机大赛(练习赛) 练习赛题单链接:传智杯练习赛 仅有会做的前四题题解,还是太弱了( ^ M ^ !!) 第一题 链接:复读 思路: 就是哈希表记录下出 ...

  6. 2022年第五届“传智杯”全国大学生IT技能大赛——程序设计挑战赛

    邀您参加第五届"传智杯"全国大学生IT技能大赛 https://m.saikr.com/active/templete/czb/1667799418?spread_code=A73 ...

  7. 第五届“传智杯”全国大学生计算机大赛(练习赛)

    前言:这次练习赛对应的洛谷原题分别是B3654.P8547.P8444.P8462.P8827.P5391.有需要的可以去洛谷找原题看题解弄懂自己不会的 官方给的:练习赛满分程序(多语言):云剪贴板 ...

  8. 第五届“传智杯”全国大学生计算机大赛(练习赛)传智杯 #5 练习赛] 平等的交易

    [传智杯 #5 练习赛] 平等的交易 题目描述 你有 n n n 件道具可以买,其中第 i i i 件的价格为 a i a_i ai​. 你有 w w w 元钱.你仅能用钱购买其中的一件商道具.当然, ...

  9. 答案解析(C语言版本)——第五届“传智杯”全国大学生计算机大赛(练习赛)

    目录 A [传智杯 #5 练习赛] 复读 输入输出样例 输入 #1 输出 #1 代码解析如下 B [传智杯 #5 练习赛] 时钟 输入输出样例 输入 #1 输出 #1 输入 #2 输出 #2 输入 # ...

最新文章

  1. jquery点击后执行PHP加载div,PHP-将JQuery自动完成附加到由Ajax调用加载的文本字段...
  2. jstl自定义标签接口介绍
  3. MapObjects2自带例子的问题
  4. 无风扇网站服务器,这款服务器采用无风扇设计
  5. php no input file specified.,nginx+php出现No input file specified解决办法
  6. 商业逻辑12讲之战略管理的逻辑
  7. cf1556D. Take a Guess
  8. 对于判断飞鸽传书2007来说是不够的
  9. 低照度图像修复方法总结
  10. linux 类似迅雷下载软件,推荐几个可以替代迅雷的下载软件
  11. Android三大动画介绍及使用
  12. C语言字符串输出中文乱码
  13. 程序带来这些新的机会,创业新浪潮才刚开始!
  14. 纯干货:微软漏洞中国第一人黄正——如何用正确姿势挖掘浏览器漏洞(附完整 PPT)
  15. VC 用发音函数Beep 播放简谱音乐
  16. 软件测试就业前景怎样
  17. 2015移动互联网行业趋势盘点(PPT)
  18. 4月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!
  19. 用Python做一个游戏辅助脚本(含完整编程思路)
  20. Android 画中画(图片)

热门文章

  1. 小米5 Android7.0 ROOT教程
  2. 从0开始搭建基于UVM的验证平台 ----- phase0.0
  3. 漫画英语作文怎么写 计算机,四级英语作文漫画类的怎么写
  4. 中山大学css,中山大学信息科学与技术学院导师介绍:黄以华
  5. Java 两数相除
  6. JAVA程序设计实战(10-13章)
  7. java 设备管理系统_设备管理系统
  8. 小程序海报生成工具,可视化编辑直接生成代码使用
  9. 虚拟创业云|BBC幼儿英语启蒙动画小鸟三号 3rd and Bird 全两季50集3-5岁
  10. 华为交换机如何导出配置信息_华为交换机作为服务端备份配置文件