比赛地址c++
题目连接
⭐数组
题目:
给出\(n\)和\(x\),对一个长度为\(n\)的数组\(b\),能够进行若干次合并任意两个元素,问对于最后数组中的剩余元素\(\sum \lceil\frac{b[i]}{x}\rceil\)的最小值和最大值分别是多少?编码
解析:spa
#include<bits/stdc++.h> using namespace std; typedef long long LL; int n; LL a[100005]; int main() { LL r; int T; LL n, x; LL mx, mn; scanf("%d", &T); while (T--) { mx = 0, mn = 0; scanf("%lld%lld", &n, &x); for (int i = 0; i < n; ++i) scanf("%lld", &a[i]), mn += a[i], mx += (a[i] + x - 1) / x; printf("%lld %lld\n", (mn + x - 1) / x, mx); } }
题目连接
⭐⭐code
题目:
给出\(n\)和\(x\),对一个长度为\(n\)的数组\(a\),顺序遍历它的元素,若是遇到的元素能够被\(x\)整除,则添加\(x\)个\(\frac{a[i]}{x}\)到数组末尾,反之则使这个功能永久禁用,问遍历过的元素和是多少?get
解析:it
#include<bits/stdc++.h> using namespace std; typedef long long LL; int n; LL dat[100005]; LL sum; int main() { int T; LL n, x, t; int mn; scanf("%d", &T); while (T--) { mn = 0x3f3f3f3f; sum = 0; scanf("%lld%lld", &n, &x); for (int i = 0; i < n; ++i) { scanf("%lld", &dat[i]); sum += dat[i]; int b = 0; LL j = 1; while (dat[i] % j == 0) j *= x, ++b; if (mn > b) { mn = b; t = i; } } LL ret = sum * mn; for (int i = 0; i < t; ++i) ret += dat[i]; printf("%lld\n", ret); } }
题目连接
⭐⭐class
题目:
有\(n\)我的,以及\(m\)个礼物,每一个人都只能买编号在\(a[i]\)以前的礼物,或者直接给\(a[i]\)对应的钱代替,每一个礼物只能被买一次,求给全部人送达礼物的最小金额(所给礼物序列按金额升序)test
解析:循环
两者相等的状况其实不须要考虑,由于即便选择了购买礼物,下一我的的下标必定是小于等于当前的下标的,因此是确定用不到 (礼物金额<必交金额)这个贪心条件的
#include<bits/stdc++.h> using namespace std; typedef long long LL; int n; const int maxn = 3e5 + 5; int k[maxn], c[maxn]; int main() { int T; int n, x, t; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &x); for (int i = 0; i < n; ++i) scanf("%d", &k[i]); sort(k, k + n); for (int i = 1; i <= x; ++i) scanf("%d", &c[i]); t = 1; LL ret = 0; for (int i = n - 1; i >= 0; --i) if (k[i] > t) ret += c[t++]; else ret += c[k[i]]; printf("%lld\n", ret); } }
题目连接
⭐⭐⭐⭐
题目:
定义对于任意两个元素知足\(\frac{lcm(a,b)}{gcd(a,b)}=x^2\)那么认为这两个元素是相邻的。如今给出一个数组,将彼此相邻的元素当作一个组,每秒组内各元素都会被组的卷积所代替,那么给出\(q\)次查询,问每秒对应的组内元素个数的最大值是多少?
解析:
注意:1s 的答案记得要在 0s 和 1s 中取最大值
#include<bits/stdc++.h> typedef long long LL; using namespace std; /*===========================================*/ const int maxn = 1000; const int base = 19260817; bool vis[maxn]; int prime[500]; map<int, int> m; int T, t, n, q, cnt; int main() { scanf("%d", &T); for (int i = 2; i < maxn; ++i) { if (!vis[i]) prime[cnt++] = i; for (int j = 0; j < cnt && i * prime[j] < maxn; ++j) { vis[i * prime[j]] = true; if (i % prime[j] == 0) break; } } while (T--) { m.clear(); scanf("%d", &n); while (n--) { int tt = 0; scanf("%d", &t); for (int i = 0; i < cnt && t != 1; ++i) { if (t % prime[i] == 0) { int c = 0; while (t % prime[i] == 0) { t /= prime[i], ++c; } if (c & 1) tt = base * tt + prime[i]; } } if (t != 1) tt = base * tt + t; ++m[tt]; } int ans[2] = { 0 }; for (auto& i : m) { ans[0] = max(ans[0], i.second); if (!i.first || i.second % 2 == 0) ans[1] += i.second; } ans[1] = max(ans[0], ans[1]); scanf("%d", &q); while (q--) { scanf("%d", &t); printf("%d\n", ans[(bool)t]); } } }