A Divisibility Problem
题意
给你两个正整数\(a,b\) 你每次可以执行一次\(a++\)操作,问你最小的操作步数,使得\(a\)能被\(b\)整除
思路
数学
分情况讨论
当\(a<b\) 时,显然只有\(a == b\)时才能保证\(a\)被\(b\)整除
当\(a>b\) 时,只要把\(a\)调整到离\(kb\)最近的一个\(b\)的倍数,即\(\lceil {a / b}\rceil * b - a\)
#include <bits/stdc++.h>
using namespace std;
#define endl ‘\n‘
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long LL;
typedef double db;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const db EXP = 1e-9;
int main() {
IO;
int t,a,b;
cin >> t;
while(t --) {
int cnt = 0;
cin >> a >> b;
if(a < b) cnt += (b - a);
else cnt += ((a + b - 1)/ b) * b - a;
cout << cnt << endl;
}
return 0;
}
B K-th Beautiful String
题意
给定一个\(n>2\)和\(k\),初始化字符串的前\(n-2\)个字符为\(a\),最后两个字符为\(b\),此为字符串的第一个排列,所有字符串的按字典序排列,让你求第\(k\)个字符串
思路
二进制,双指针,贪心
把\(a\)看成\(0\),\(b\)看成\(1\),整个字符串的排列就是一个二进制加法
每次,排列的名次\(+1\),整个字符串就加上它的\(lowbit()\),为了保证整个字符串只有两个\(b\)
如果lowbit发生了进位,就要在末尾再加上一个\(1\)
具体做法不能直接按二进制加法来,因为题目的数据范围是\(1e5\),\(int,long long\)等数据类型都达不到这么长的数据位,所以考虑维护两个指针\(i,j\) 分别表示第一个\(b\)的位置和第二个\(b\)的位置
如果\(i+1==j\)说明\(i,j\)相邻,那么他们相加必然导致进位,所以\(i++,j=n\),
如果\(i,j\)不相邻,每次只需要处理\(j\)的进位即可,\(j++\)
循环\(k\)次,\(i,j\)的位置即是两个\(b\)的位
#include <bits/stdc++.h>
using namespace std;
#define endl ‘\n‘
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long LL;
typedef double db;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const db EXP = 1e-9;
int main() {
IO;
int t,n,k;
cin >> t;
while(t --) {
cin >> n >> k;
int i = n - 1,j = n;// b is here;
k --;
while(k --) {
if(i + 1 == j) {
i --;
j = n;
}
else {
j --;
}
}
for(int k = 1;k <= n; ++k) {
if(k == i || k == j) cout << ‘b‘;
else cout << ‘a‘;
}
cout << endl;
}
return 0;
}
C Ternary XOR
题意
给定一个三进制的数\(c\),定义运算符\(⊙\) 表示\(c_i=(a_i+b_i)\mod3\)
让你求另外两个三进制数\(a,b\),使得\(c=a⊙b\),且\(max(a,b)\)最小
思路
贪心
因为它的运算不涉及进位,只对当前位有影响,所以只考虑当前位即可
对于\(c_i\)的每一位,先尽量保持均分到\(a_i,b_i\)
如果某一位在过程中发生了\(0,1\)分配,那么接下来的所有数字都分配到\(0\)那一位后面即可
这样就能使得\(a,b\)尽可能相近了。
#include <bits/stdc++.h>
using namespace std;
#define endl ‘\n‘
#define IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef long long LL;
typedef double db;
typedef pair<int,int> PII;
const int N = 5e4 + 10;
const int mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const db EXP = 1e-9;
int a[N],c[N],b[N];
int main() {
IO;
int t,n;
char x;
cin >> t;
while(t --) {
memset(b,0,sizeof b);
memset(c,0,sizeof c);
cin >> n;
for(int i = 0;i < n; ++i) {
cin >> x;
a[i] = x - ‘0‘;
}
b[0] = c[0] = 1;
int f = 0;
for(int i = 1;i < n; ++i) {
if(a[i] == 1 && !f) {
if(b[i - 1] && !c[i - 1]) c[i] = 1;
else if(!b[i - 1] && c[i - 1]) b[i] = 1;
else b[i] = 1,f = 1;
}
else if(a[i] == 2 && !f) {
if(b[i - 1] && !c[i - 1]) c[i] = 2;
else if(!b[i - 1] && c[i - 1]) b[i] = 2;
else {
b[i] = 1;
c[i] = 1;
}
}
else if(f) {
for(int j = i;j < n; ++j) {
c[j] = a[j];
}
break;
}
}
for(int i = 0;i < n; ++i) cout << b[i];
cout << endl;
for(int i = 0;i < n; ++i) cout << c[i];
cout << endl;
}
return 0;
}
原文地址:https://www.cnblogs.com/lukelmouse/p/12579396.html