Codeforces Round #739 (Div. 3)

A. Dislike of Threes

找到第kkk个既不是333的倍数,个位数上也不是333的数,也已预处理然后O(1)O(1)O(1)输出,也可直接forforfor循环暴力。

#include <bits/stdc++.h>using namespace std;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);vector<int> a;for (int i = 1; i <= 2000; i++) {if (i % 3 == 0 || i % 10 == 3) {continue;}a.push_back(i);}int T, n;cin >> T;while (T--) {cin >> n;cout << a[n - 1] << "\n";}return 0;
}

B. Who’s Opposite?

由2×n2 \times n2×n个数按照顺序构成一圈,iii的对立是i+ni + ni+n,给定两个对立的a,ba, ba,b,求ccc的对立是谁。

容易发现abs(a−b)=nabs(a - b) = nabs(a−b)=n,所以只要判断a,b,ca, b, ca,b,c是否合法≤2×n\le 2 \times n≤2×n,然后判断ccc在前半圈还是后半圈即可。

#include <bits/stdc++.h>using namespace std;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int T;cin >> T;while (T--) {int a, b, c;cin >> a >> b >> c;if (a > b) {swap(a, b);}int haf = b - a;if (c > haf * 2 || a > haf * 2 || b > haf * 2) {puts("-1");}else {if (c > haf) {printf("%d\n", c - haf);}else {printf("%d\n", c + haf);}}}return 0;
}

C. Infinity Table

可以得到,第iii次书写,有2×i−12 \times i - 12×i−1个数字,所以直接模拟即可,复杂度TkT \sqrt kTk​,当然也可以预处理一下,然后二分O(k+Tlog⁡k)O(\sqrt k + T \log k)O(k​+Tlogk)。

#include <bits/stdc++.h>using namespace std;int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int T;cin >> T;while (T--) {int n;cin >> n;for (int i = 1; ; i++) {int cur = 2 * i - 1;if (n > cur) {n -= cur;}else {if (n <= i) {printf("%d %d\n", n, i);}else {n -= i;printf("%d %d\n", i, i - n);}break;}}}return 0;
}

D. Make a Power of Two

给定一个数字字符串,可以移走其中任意数字,或者在末尾添加任意数字,要求在最少的步骤将其变为222的幂次。

考虑得到2602 ^{60}260以内所有222的幂次数字的字符串,让给定字符串在上面按照顺序匹配,

找到能匹配上的一个最大子序列,然后计算操作次数,不断取最小值即可,整体复杂度O(60×10×T)O(60 \times 10 \times T)O(60×10×T)。

#include <bits/stdc++.h>using namespace std;string a[60];void init() {for (int i = 0; i < 60; i++) {long long cur = 1ll << i;while (cur) {a[i] += char(cur % 10 + '0');cur /= 10;}reverse(a[i].begin(), a[i].end());}
}int f(string str) {int ans = 0x3f3f3f3f;for (int i = 0; i < 60; i++) {int sum = 0, p1 = 0, p2 = 0, n = str.size(), m = a[i].size();while (p1 < n && p2 < m) {if (str[p1] == a[i][p2]) {p1++, p2++, sum++;}else {p1++;}}ans = min(ans, n - sum + m - p2);}return ans;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);init();int T;cin >> T;while (T--) {string str;cin >> str;cout << min(f(str), (int)str.size() + 1) << "\n";}return 0;
}

E. Polycarp and String Transformation

考虑对串从后往前开始做,不难得到删除字母的顺序,我们再对字母的个数统计一下,加入字母ccc是在第kkk次删除,总共出现了xxx次,

那么我们可以得出字母ccc在原串中出现的次数就是xk\frac{x}{k}kx​次,通过这个,我们可以统计出原串的长度,

然后再对原串O(不同字母个数×lenth)O(不同字母个数 \times lenth)O(不同字母个数×lenth),统计模拟一下即可得到一个新的串,然后与给定串对比一下是否一样即可。

#include <bits/stdc++.h>using namespace std;const int N = 5e5 + 10;int num[30], vis[N], len, cnt, n;char str[N];bool judge(int len) {string s;for (int i = 1; i <= len; i++) {s += str[i];}string ans = s;for (int i = 1; i <= cnt; i++) {string cur = "";for (auto it : s) {if (vis[i] == it - 'a') {continue;}cur += it;}ans += cur;s = cur;}if (n != ans.size()) {return false;}for (int i = 1; i <= n; i++) {if (str[i] != ans[i - 1]) {return false;}}return true;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int T;scanf("%d", &T);while (T--) {scanf("%s", str + 1);n = strlen(str + 1);for (int i = n; i >= 1; i--) {num[str[i] - 'a']++;if (num[str[i] - 'a'] == 1) {vis[++cnt] = str[i] - 'a';}}len = 0;reverse(vis + 1, vis + 1 + cnt);for (int i = 1; i <= cnt; i++) {len += num[vis[i]] / i;}if (judge(len)) {for (int i = 1; i <= len; i++) {putchar(str[i]);}putchar(' ');for (int i = 1; i <= cnt; i++) {putchar(char(vis[i] + 'a'));}puts("");}else {puts("-1");}for (int i = 0; i < 26; i++) {num[i] = 0;}cnt = 0;}return 0;
}

F. Nearest Beautiful Number

easyhardeasy\ hardeasy hard的做法都是一样的,考虑数位dpdpdp:

我们定义f[i][j][k]f[i][j][k]f[i][j][k],表示第iii位前已用数字的状态是jjj,后面还剩下kkk位不同的数字可用,jjj是一个最大值为210−12 ^{10} - 1210−1的二进制数。

通过定义可以发现这个状态对于不同的给定的KKK都是没有影响的,所以可以不用每次做都去memsetmemsetmemset,直接dpdpdp即可。

或者我们可以考虑定义f[i][j][k]f[i][j][k]f[i][j][k],表示第iii位前医用数字的状态是jjj,总的可用的不同数位是kkk,然后根据不同的KKK去转移也可。

最后,对于给定的n,Kn, Kn,K,我们先数位dpdpdp得到x≤n−1x \le n - 1x≤n−1,且最多有KKK位不同的数字有多少个,然后二分数位dpdpdp去检验答案。

整体复杂度O(T×10×log⁡n+10×1024×10)O(T \times 10 \times \log n + 10 \times 1024 \times 10)O(T×10×logn+10×1024×10)。

#include <bits/stdc++.h>using namespace std;int f[15][1050][15], p[15], tot, n, k;int dfs(int pos, int cur, int last, int flag, int lim) {if (last < 0) {return 0;}if (!pos) {return !lim;}if (!flag && !lim && f[pos][cur][last] != -1) {return f[pos][cur][last];}int ans = 0, nex = flag ? p[pos] : 9;for (int i = 0; i <= nex; i++) {if (lim) {if (i == 0) {ans += dfs(pos - 1, cur, last, 0, 1);}else {int mins = cur >> i & 1 ? 0 : 1;ans += dfs(pos - 1, cur | (1 << i), last - mins, flag && i == nex, 0);}}else {int mins = cur >> i & 1 ? 0 : 1;ans += dfs(pos - 1, cur | (1 << i), last - mins, flag && i == nex, 0);}}if (!flag && !lim) {f[pos][cur][last] = ans;}return ans;
}int calc(int x) {tot = 0;while (x) {p[++tot] = x % 10;x /= 10;}return dfs(tot, 0, k, 1, 1);
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);memset(f, -1, sizeof f);int T;scanf("%d", &T);while (T--) {scanf("%d %d", &n, &k);int cur = calc(n - 1);int l = n, r = 2000000000;while (l < r) {int mid = 1ll * l + r >> 1;if (calc(mid) > cur) {r = mid;}else {l = mid + 1;}}printf("%d\n", l);}return 0;
}

Codeforces Round #739 (Div. 3)(AK实况)相关推荐

  1. Codeforces Round #739 (Div. 3) ABCDEF1F2 解题思路

    Codeforces Round #739 (Div. 3) 可能是一开始大佬都写F1去了,我在D写完后发现F过的人数比E多了好多(个位数与十位数),以为F1比较简单,就直接开F1了,但自己分类讨论老 ...

  2. Codeforces Round #739 (Div. 3) A. Dislike of Threes

    Codeforces Round #739 (Div. 3)的其他题解在这 A. Dislike of Threes 题目大意: 输出第k个结尾数字不是3且不能被3整除的数 思路: 先初始化一下,然后 ...

  3. Codeforces Round #739 (Div. 3) 「A B C D E F1 F2」

    Codeforces Round #739 (Div. 3) A. Dislike of Threes 题目描述: 如果一个数能被3整除或者十进制结尾的数字是3则是无趣的数,你想知道第n个有趣的数是什 ...

  4. Codeforces Round #739 (Div. 3)题解A-E

    A.Dislike of Threes Problem - A - Codeforces 题意: Polycarp不喜欢在十进制表示中可以被3整除的整数 或以数3字结尾的整数. Polycarp 也不 ...

  5. Codeforces 1660 Codeforces Round #780 (Div. 3)-AK题解

    题目链接 A 题意 你现在有a个一元硬币和b个两元硬币,问你最小不能拼凑出来的钱数是多少? 思路 如果没有一元硬币,那么答案就是1 否则答案就是a+b∗2+1a+b*2+1a+b∗2+1. AC代码 ...

  6. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  7. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  8. Codeforces Round #694 (Div. 1 + Div2)(A ~ H,8题全,超高质量题解)【每日亿题】2021/2/1、2/2

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 [每日亿题]Codeforces Round #694 (Div. 1 + Div2)(A ~ ...

  9. Codeforces Round #533 (Div. 2)题解

    link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...

最新文章

  1. LeetCode 3Sum
  2. 后盾网lavarel视频项目---laravel 使用laracasts/flash插件提示信息
  3. 1 文巾解题 191. 位1的个数
  4. 关于核定区域电网2018—2019年输电价格的通知
  5. 树莓派 VNC Viewer 远程桌面配置教程
  6. OpenLayers3 online build
  7. 【渝粤教育】广东开放大学 演讲与口才 形成性考核 (1)
  8. Tip:强制执行exchange DAG节点之间的数据库副本移动
  9. python n个list如何组成矩阵_学完Python,我决定熬夜整理这篇总结...
  10. jmeter 添加虚拟IP
  11. 腾讯电脑管家离线安装包_这个良心小工具,让你电脑流畅1倍,干掉流氓软件...
  12. kotlin 运算符_Kotlin属性,数据类型,运算符
  13. solr mysql原理_solr replication原理探究
  14. wifi频率和zigbee干扰_设置Zigbee和wifi信道避免干扰的方法
  15. 计算机类毕业设计评阅书评语,本科毕业论文评阅人评语_毕业论文评阅人评语模板文库_本科毕业论文评阅老师评语大全...
  16. 在职读研难,社科院与杜兰大学金融管理硕士项目让读研多了一种选择
  17. asp实训报告摘要_ASP实训总结
  18. 2022-2027年中国微创介入医疗器械市场竞争态势及行业投资前景预测报告
  19. 小米智能家居硬件的发展进程盘点
  20. python flask热更新_客户端python热更新

热门文章

  1. 在河北当中学老师用不用考计算机,河北省教育厅出台新方案 师范生当教师也需考证...
  2. 神奇又好玩的谢尔宾斯基雪花!
  3. 什么时候告白最合适?
  4. 见识过世界的强大,才能拥有掌握世界的力量
  5. 一文读懂 KMP 算法
  6. 工业相机与民用相机的区别_工业相机和普通相机的区别详解
  7. layui 如何去dom_javascript 怎么去引用layui里面的方法
  8. cheatengine找不到数值_“不会找问题”,只配在底层,最高效的思维方式导图,人生开挂!...
  9. 理请求时出现未知错误.服务器返回的状态码为: 500,react-native
  10. centos php.ini redis,CentOS下安装Redis及Redis的PHP扩展