Loading... ## 第一题: ### 题目描述 <div class="tip inlineBlock info"> **卡片:** 小蓝有很多数字卡片,每张卡片上都是数字0 到9。 小蓝准备用这些卡片来拼一些数,他想从1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从1 拼到多少。 例如,当小蓝有30 张卡片,其中0 到9 各3 张,则小蓝可以拼出1 到10,但是拼11 时卡片1 已经只有一张了,不够拼出11。 现在小蓝手里有0 到9 的卡片各2021 张,共20210 张,请问小蓝可以从1拼到多少? 提示:建议使用计算机编程解决问题。 </div> ### 题解: ```cpp #include<bits/stdc++.h> using namespace std; const int N = 2021; int arr[10]; bool check(int n){ while(n){ int tmp = n % 10; arr[tmp] --; if(arr[tmp] < 0) return false; n /= 10; } return true; } int main() { int res = 0; //初始化每一张都为2021 for(int i = 0;i < 10; i++) arr[i] = 2021; for(int i = 1; i < 5e5; i++){ if(check(i)) res++; else break; } cout << res << endl; return 0; } ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1550** ### 答案: **8081** ## 第二题: ### 题目描述: <div class="tip inlineBlock info"> 直线: 在平面直角坐标系中,两点可以确定一条直线。 如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。 给定平面上2 × 3 个整点{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}, 即横坐标是0 到1 (包含0 和1) 之间的整数、纵坐标是0 到2 (包含0 和2) 之间的整数的点。 这些点一共确定了11 条不同的直线。 给定平面上20 × 21 个整点{(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}, 即横坐标是0 到19 (包含0 和19) 之间的整数、纵坐标是0 到20 (包含0 和20) 之间的整数的点。 请问这些点一共确定了多少条不同的直线。 </div> ### 题解: ```cpp #include<bits/stdc++.h> using namespace std; #define x first #define y second typedef pair<double, double> PII; const int N = 100; vector<PII> arr; int main() { for(double x1 = 0; x1 < 20; x1++) { for(double y1 = 0; y1 < 21; y1++) { for(double x2 = 0; x2 < 20; x2++) { for(double y2 = 0; y2 < 21; y2++) { if(x2 != x1) { double k = (y2 - y1) / (x2 - x1); double b = y1 - k * x1; PII tmp = {k, b}; arr.push_back(tmp); } } } } } sort(arr.begin(), arr.end()); int res = 1; //因为double有精度误差,我们把误差控制到1e-8次方就认为是两条不同的直线 for(int i = 1; i < arr.size(); i++) { if(fabs(arr[i].x - arr[i-1].x) > 1e-8 || fabs(arr[i].y - arr[i-1].y) > 1e-8) { res ++; } } //最后记得加上 斜率为0 的20条直线 cout << res + 20; return 0; } ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1551** ### 答案: **40257** ## 第三题: ### 题目描述: <div class="tip inlineBlock info"> **货物摆放:** 小蓝有一个超大的仓库,可以摆放很多货物。 现在,小蓝有n 箱货物要摆放在仓库,每箱货物都是规则的正方体。 小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上分别堆L、W、H 的货物,满足n = L × W × H。 给定n,请问有多少种堆放货物的方案满足要求。 例如,当n = 4 时,有以下6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。 请问,当n = 2021041820210418 (注意有16 位数字)时,总共有多少种 方案? 提示:建议使用计算机编程解决问题。 </div> ### 题解: ```cpp #include<bits/stdc++.h> using namespace std; typedef long long LL; vector<LL> arr; int main() { int res = 0; LL n = 2021041820210418; for(LL i = 1; i * i <= n; i++) { if(n % i == 0) { arr.push_back(i); if(n % i != n / i) arr.push_back(n / i); } } //因为题目并不考虑顺序的问题,所以全部下标可从0开始 for(int i = 0; i < arr.size(); i++){ for(int j = 0; j < arr.size(); j++){ for(int k = 0; k < arr.size(); k++){ if(arr[i] * arr[j] * arr[k] == n) res ++; } } } cout << res << endl; return 0; } ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1552** ### 答案: **2430** ## 第四题: ### 题目描述: <div class="tip inlineBlock info"> **路径:** 小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图中的最短路径。 小蓝的图由2021 个结点组成,依次编号1 至2021。 对于两个不同的结点a, b,如果a 和b 的差的绝对值大于21,则两个结点之间没有边相连; 如果a 和b 的差的绝对值小于等于21,则两个点之间有一条长度为a 和b 的最小公倍数的无向边相连。 例如:结点1 和结点23 之间没有边相连;结点3 和结点24 之间有一条无向边,长度为24; 结点15 和结点25 之间有一条无向边,长度为75。 请计算,结点1 和结点2021 之间的最短路径长度是多少。 提示:建议使用计算机编程解决问题。 </div> ### 题解: ```cpp ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1553** ### 答案: **不会** ## 第五题: ### 题目描述: <div class="tip inlineBlock info"> **空间:** 小蓝准备用256MB 的内存空间开一个数组,数组的每个元素都是32 位二进制整数。 如果不考虑程序占用的空间和维护内存需要的辅助空间,请问256MB 的空间可以存储多少个32 位二进制整数? </div> ### 题解: ```cpp #include<bits/stdc++.h> using namespace std; int main() { // 1MB = 1024KB 、1KB = 1024B、1B = 8b、1位 = 1b //long long n = 256 * 1024 * 1024 * 8 / 32; //上面会直接爆long long,所以我们得先把8 / 32 == 4 算出来 long long n = 256 * 1024 * 1024 / 4; cout << n; return 0; } ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1555** ### 答案: **67108864** ## 第六题: ### 题目描述: <div class="tip inlineBlock info"> **砝码称重:** 你有一架天平和N 个砝码,这N 个砝码重量依次是W1, W2, ... , WN。 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。 </div> ### 题解: ```cpp ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1558** ## 第七题: ### 题目描述: <div class="tip inlineBlock info"> **括号序列:** 给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法。 当添加完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果。 两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括号。 例如,对于括号序列(((),只需要添加两个括号就能让其合法 有以下几种不同的添加结果:()()()、()(())、(())()、(()()) 和((()))。 </div> ### 题解: ```cpp ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1561** ## 第八题: ### 题目描述: <div class="tip inlineBlock info"> **时间显示:** 小蓝要和朋友合作开发一个时间显示的网站。 在服务器上,朋友已经获取了当前的时间,用一个整数表示。 值为从1970 年1 月1 日00:00:00 到当前时刻经过的毫秒数。 现在,小蓝要在客户端显示出这个时间。 小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。 给定一个用整数表示的时间,请将这个时间对应的时分秒输出。 </div> ### 题解: ```cpp #include<bits/stdc++.h> using namespace std; typedef long long LL; int main() { LL n, c; cin >> c; while(c--) { cin >> n; n /= 1000; //1秒等于1000毫秒 int t = n % (24 * 60 * 60); //得到最后一天的秒数 int shi = t / 3600; //得到小时数 int fen = t % 3600 / 60; //去掉小时再去掉秒 int miao = n % 60; //求余得最后一天的秒数 printf("%02d:%02d:%02d\n", shi, fen, miao); } return 0; } ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1563** ## 第九题: ### 题目描述: <div class="tip inlineBlock info"> **杨辉三角形:** 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列: 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ... 给定一个正整数N,请你输出数列中第一次出现N 是在第几个数? </div> ### 题解: ```cpp ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1564** ## 第十题: ### 题目描述: <div class="tip inlineBlock info"> **双向排序:** 给定序列(a[1], a[2], ... , a[n]) = (1, 2, ... , n),即a[i] = i。 小蓝将对这个序列进行m次操作,每次可能是将a[1], a[2], ... a[qi] 降序排列,或者将a[qi], a[qi+1], ... , a[n] 升序排列。 请求出操作完成后的序列。 </div> ### 题解: ```cpp ``` ### 第三方oj: **http://oj.ecustacm.cn/problem.php?id=1565** 最后修改:2022 年 04 月 07 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果文章有用,请随意打赏。