2022广东工业大学新生程序设计竞赛

文章目录

  • 2022广东工业大学新生程序设计竞赛
    • H. 马子哥的奖金
    • I. 奇迹和魔法都是存在的
    • J. 狐臭的等比数列
    • K. 玩石头
    • L. jjgg的难题
    • M. Poppin'Party的star★

H. 马子哥的奖金

题意:从 n n n个数中取 k k k个,使得 k k k个数的乘积最大,输出 k k k个数的乘积模 1 e 9 + 7 1e9 + 7 1e9+7。

思路:负数两两一组,排个序贪心的取,如果绝对值最大的两个负数相乘大于最大的两个非负数,那么取两个负数,否则取一个最大的正数,直到把 k k k取完。(需要判一下边界条件)

坑点:没有正数且 k k k是奇数的时候,取的 k k k个数应是绝对值最小的。

#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define int llconst int mod = 1e9 + 7;signed main() {ios::sync_with_stdio(false);int n, k, x;cin >> n >> k;int ans = 1;vector<int> a, b;int sza = 0;for (int i = 1; i <= n; i++) {cin >> x;if (x >= 0) a.push_back(x), sza++;else b.push_back(x);}int szb = n - sza;sort(a.begin(), a.end(), greater<int>());sort(b.begin(), b.end());int cura = 0, curb = 0;if (!sza && (k & 1)) {for (int i = n - k; i < n; i++) {ans = ans * b[i] % mod;}cout << ans << '\n';return 0;}while (k) {if (k > 1 && curb + 1 < szb && (cura + 1 >= sza || a[cura] * a[cura + 1] < b[curb] * b[curb + 1])) {ans = b[curb] * b[curb + 1] % mod * ans % mod;k -= 2;curb += 2;} else {ans = a[cura] * ans % mod;cura++;k--;}}cout << ans << '\n';return 0;
}

I. 奇迹和魔法都是存在的

题意:给定一个长度为 n n n的数组,询问 m m m个区间,问操作任意次后最后剩下的数可能有几个。每次操作是把一个区间删除,留下第一个或最大的那个。

思路:我们需要手模一下,理解之后就很简单了,其实就是不小于第一个的都能留下来。

#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define int llsigned main() {ios::sync_with_stdio(false);int n, m;cin >> n >> m;vector<int> a(n + 1);for (int i = 1; i <= n; i++) {cin >> a[i];}int l, r, ans;while (m--) {cin >> l >> r;ans = 0;for (int i = l; i <= r; i++) {if (a[i] >= a[l]) ans++;}cout << ans << '\n';}return 0;
}

J. 狐臭的等比数列

题意:给定一个长度为 n n n的数组,问最少需要连续的多少项等比数列能包括所有 n n n个数。

思路:由于是等比数列,我们可以考虑公比最大是多少,而这个公比不一定是整数,我本来想重载一个 d o u b l e double double型的 g c d gcd gcd但失败了,后面想到枚举所有质数来做。
首先,我们分解所有数的质因子,由于 1 e 18 1e18 1e18很大,我们要用到 P o l l a r d − R h o Pollard-Rho Pollard−Rho。
然后,我们对所有质数都跑一遍,求公比含有这个质数时,最少需要多少项。
最后,因为要对所有都满足,所以我们应该求的是最大值。

#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define int llmt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());using i128 = __int128;int qpow(int a, int b, int mod) {int res = 1;while (b) {if (b & 1) res = (i128) res * a % mod;a = (i128) a * a % mod;b >>= 1;}return res;
}bool Miller_Rabin(int p) {if (p < 2) return 0;if (p == 2 || p == 3) return 1;int d = p - 1, r = 0;while (!(d & 1)) ++r, d >>= 1;for (int k = 0; k < 10; k++) {int a = rand() % (p - 2) + 2;int x = qpow(a, d, p);if (x == 1 || x == p - 1) continue;for (int i = 1; i < r; ++i) {x = (i128) x * x % p;if (x == p - 1) break;}if (x != p - 1) return 0;}return 1;
}int Pollard_Rho(int x) {int s = 0, t = 0;int c = rand() % (x - 1) + 1;int val = 1;for (int goal = 1;; goal *= 2, s = t, val = 1) {for (int step = 1; step <= goal; ++step) {t = ((i128) t * t + c) % x;val = (i128) val * abs(t - s) % x;if ((step % 127) == 0) {int d = __gcd(val, x);if (d > 1) return d;}}int d = __gcd(val, x);if (d > 1) return d;}
}void fac(int x, vector<int> &ans) {if (x < 2) return;if (Miller_Rabin(x)) {ans.push_back(x);return;}int p = x;while (p >= x) p = Pollard_Rho(x);while ((x % p) == 0) x /= p;fac(x, ans), fac(p, ans);
}signed main() {ios::sync_with_stdio(false);int n;cin >> n;vector<int> a(n);for (int i = 0; i < n; i++) cin >> a[i];sort(a.begin(), a.end());if (a[0] == a.back()) {cout << n << '\n';return 0;}vector<vector<int>> p(n);set<int> s;for (int i = 0; i < n; i++) {fac(a[i], p[i]);s.insert(p[i].begin(), p[i].end());}int ans = n;for (auto u: s) {int la = -1, st = 0, d = 0;for (int i = 0; i < n; i++) {int c = 0;while ((a[i] % u) == 0) a[i] /= u, c++;if (!i)st = c;elsed = __gcd(d, abs(c - la));la = c;}if (d) ans = max(ans, abs(la - st) / d + 1);}cout << ans << '\n';return 0;
}

K. 玩石头

题意:有 n n n颗石头,每颗石头有重量和价值,每颗石头垒起来的条件是这颗石头上面的所有石头的重量和比这颗石头小,问垒起来的价值和最大是多少。

思路:由于我们发现最小 1 , 2 , 4 , 8 , . . . 1,2,4,8,... 1,2,4,8,...最多垒 30 30 30层,而价值最大只有 100 100 100,想到 d p dp dp, d p [ i ] dp[i] dp[i]表示构成价值和为 i i i的最小重量。

  • d p [ i + v ] = m i n ( d p [ i + v ] , d p [ i ] + w ) dp[i+v]=min(dp[i+v],dp[i]+w) dp[i+v]=min(dp[i+v],dp[i]+w)

那么只要 d p [ i ] ! = i n f dp[i]!=inf dp[i]!=inf,就存在一种合理的垒搭方式。

#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define int llconst int N = 3e3 + 110;int dp[N];signed main() {ios::sync_with_stdio(false);for (int i = 0; i < N; i++) {dp[i] = 1e18;}dp[0] = 0;int n;cin >> n;vector<pair<int, int>> a(n);for (int i = 0; i < n; i++) {cin >> a[i].first >> a[i].second;}sort(a.begin(), a.end());for (auto [w, v]: a) {for (int i = 3000; i >= 0; i--) {if (dp[i] < w) {dp[i + v] = min(dp[i + v], dp[i] + w);}}}for (int i = 3000; i >= 0; i--) {if (dp[i] != 1e18) {cout << i << '\n';break;}}return 0;
}

L. jjgg的难题

题意:给定 n n n和 s s s,问使得 n n n在 p p p进制下各数位的和等于 s s s, p p p最小是多少,若不存在则输出 − 1 -1 −1。

思路:根号分治

  1. 对于 p ⩽ n p\leqslant\sqrt{n} p⩽n ​时,暴力枚举 p p p从 2 2 2到 n \sqrt{n} n ​
    • 对于 p > n p>\sqrt{n} p>n ​时,我们可以发现 n = i ∗ p + k n=i*p+k n=i∗p+k,并且 s = i + k s=i+k s=i+k
    • 那么,则有 n − s = i ∗ ( p − 1 ) n-s=i*(p-1) n−s=i∗(p−1),又 i < p i<p i<p, 我们又可以根号枚举 i i i
    • 特别的,对于 n = s n=s n=s需要特判
#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define int llsigned main() {ios::sync_with_stdio(false);int n, s;cin >> n >> s;bool f = 1;for (int i = 2; i * i <= n; i++){int sum = 0;int x = n;while(x) {sum += x % i;x /= i;}if (sum == s) {f = 0;cout << i << '\n';break;}}if (f) {int ans = -1;if (n == s) ans = n + 1;for (int i = 1; i * i <= (n - s) && i <= s; i++) {if ((n - s) % i == 0) {int j = (n - s) / i + 1;int k = n % j;if (i + k == s) {ans = j;}}}cout << ans << '\n';}return 0;
}

M. Poppin’Party的star★

题意:给定一个 n ∗ m n*m n∗m的矩形纸片,问你能从中剪除最大的正五角星的面积是多少。

思路:先预算出,正五边形的长宽比 γ \gamma γ,以及正五角星和外接正五边形的面积比 α \alpha α,还有已知正五边形半径 r r r,求正五边形面积 S ( r ) S(r) S(r)。
然后我们可以发现,正五角星的中心肯定和矩形中心重合,然后我们把五角星旋转即可求出最大半径。
而且只需 36 36 36度就会重复,那直接二分即可。

#include <bits/stdc++.h>using namespace std;typedef long long ll;
#define int llconst double pi = acos(-1.0);
#define tr(x) (pi / 180 * (x))
const double alpha = 1 - tan(tr(36)) / tan(tr(54));
const double gama = 2 * sin(tr(72)) / (1 + sin(tr(54)));
const double eps = 1e-8;int cmp(double x) {return x > eps ? 1 : (x < -eps ? -1 : 0);
}double L(double x) {return sin(tr(72 - x)) + sin(tr(72 + x));
}double W(double x) {return cos(tr(x)) + sin(tr(54 + x));
}double calc(double x) {return L(x) / W(x);
}double S(double r) {return 5.0 / 2 * r * r * alpha * sin(tr(72));
}signed main() {ios::sync_with_stdio(false);cout << fixed << setprecision(12);int n, m;cin >> n >> m;if (n < m) swap(n, m);if (n * 1.0 / m > gama) {cout << S(m / W(0)) << '\n';return 0;}double l = 0, r = 36;while (cmp(r - l)) {double mid = (l + r) / 2;int res = cmp(calc(mid) - n * 1.0 / m);if (!res) {l = r = mid;} else {res == 1 ? l = mid : r = mid;}}cout << S(n / L((l + r) / 2)) << '\n';return 0;
}

2022广东工业大学文远知行杯新生程序设计竞赛题解相关推荐

  1. 广东工业大学文远知行杯新生程序设计竞赛(重现赛)复习

    广东工业大学文远知行杯新生程序设计竞赛(重现赛) 1,F,亚子和燐子的game 思路: 我们可以维护一个堆(里面的数都相等,其实就是一个数),每扔进去一个数,就继续维持堆中数字相等(维持方法,就是谁大 ...

  2. 广东工业大学文远知行杯新生程序设计竞赛(牛客比赛)

    链接如下: 广东工业大学文远知行杯新生程序设计竞赛(重现赛)_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ大学ACM校赛新生赛是面向ACM/ICPC/CCPC/区域赛校 ...

  3. 2018年广东工业大学文远知行杯新生程序设计竞赛 1001 文远知行β

    Problem Description "上一个国家的人真的是好心呢." 在山脉群之间,是一片宽广平坦的大地.被草木覆盖的绿意,顺着灰色的山间延伸. 摩托车(注:两轮的车子,尤其是 ...

  4. 2022年广东工业大学文远知行杯新生程序设计竞赛(10/13)

    迫真算法部・ACの裏技 模拟 AC代码: #include <bits/stdc++.h> using namespace std; using LL = long long; int m ...

  5. 2018年广东工业大学文远知行杯新生程序设计竞赛 1006 那天的延长线在今天β...

    Problem Description In the world line 1.048596% "梓川......今天是第几次了?" 双叶理央正在摆弄虹吸式咖啡壶,她看梓川咲太的目 ...

  6. 2018年广东工业大学文远知行杯新生程序设计竞赛 1006 那天的延长线在今天β

    Problem Description In the world line 1.048596% "梓川......今天是第几次了?" 双叶理央正在摆弄虹吸式咖啡壶,她看梓川咲太的目 ...

  7. 2018年广东工业大学文远知行杯新生程序设计竞赛 1010 温柔的手彼此相系β

    Problem Description In the world line 1.048596% 回到了比过去还遥远的过去,拯救了牧之原翔子和樱岛麻衣后,世界重归平静. 时间转眼就到了正月新年.梓川咲太 ...

  8. 2018年广东工业大学文远知行杯新生程序设计竞赛 1004 明日会吹明日的风β

    Problem Description In the world line 1.048596% "为了帮助笨蛋梓川利用程序来解决青春期症候群的问题,我觉得有必要你给你普及一下C语言的内存知识 ...

  9. 2018年广东工业大学文远知行杯新生程序设计竞赛 1007 活在无尽梦境的后续 β...

    Problem Description In the world line 1.048596% --咲太小弟,我认为啊,人生是为了变温柔而存在的. --为了达到『温柔』这个目标,我努力活到现在. 在梓 ...

最新文章

  1. 范数与距离的关系以及在机器学习中的应用
  2. Springboot @Value获取配置文件中的值失效
  3. 【动态规划】城市交通
  4. 100行Python代码理解深度学习关键概念:从头构建恶性肿瘤检测网络
  5. 2016年下半年《软件评测师》下午试卷及答案
  6. mysql optimizer mrr_[转] MySQL 的 MRR 到底是什么?
  7. 'utf8' codec can't decode byte --python
  8. 「支持m1」命令行终端美化模拟器—Hyper for Mac
  9. model.load_state_dict(checkpoint[‘state_dict‘]) KeyError: ‘state_dict‘
  10. Microsoft Exchange 2010 and Outlook 2010
  11. asp.net开源资料——国内.NET论坛源代码
  12. 基于树莓派SHT20温湿度采样
  13. http请求 405错误
  14. linux查看运行的虚拟机,windows,linux,esxi系统判断当前主机是物理机还是虚拟机?查询主机序列号命令...
  15. 微信平台分账产品怎么选?
  16. 数学基础(矢量, 向量,矩阵,相等,加法,乘法)
  17. r -括号[ ]和双括号[[ ]]之间的差异
  18. 利用ESP8266-12F实现与51单片机通信及温湿度传感器数据交互
  19. 物联网平台行业类型划分:CMP、DMP、AEP、BAP
  20. 回溯算法总结(java)

热门文章

  1. liunx系统中的盘符能修改嘛_win7系统如何修改硬盘图标
  2. 【esp32lvgl】-2.7 #lvgl-wifi连接
  3. 神经网络-入门3-术语
  4. html5 pjax,pjax——页面无刷新跳转
  5. python输出文本框_python TKinter获取文本框内容的方法
  6. iPhone 5S真机曝光 采用苹果A7处理器
  7. Solidity 中 receive 函数 和 callback函数分析
  8. java实现ajax同名验证_jQuery+Ajax实现用户名重名实时检测
  9. mbp touchbar设置_揭秘MBP的Touch Bar:原来它并非看上去那么简单
  10. 【末日祭典】魔法门英雄无敌III——lanruo