A. Payment Without Change
Description
给出a个价值为n的硬币和b个价值为1的硬币,问凑出来s元钱。
Solution
$lfloor frac{s}{n} floor imes n + b geq s$
我还憨憨写了个二分。结果只是因为爆int。
1 #include <algorithm> 2 #include <numeric> 3 #include <cctype> 4 #include <cmath> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cstring> 8 #include <iostream> 9 #include <map> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 1e5 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 int main(int argc, char const *argv[]) 88 { 89 #ifndef ONLINE_JUDGE 90 freopen("in.txt","r", stdin); 91 // freopen("out.txt","w", stdout); 92 #endif 93 int t = read<int>(); 94 while(t--){ 95 ll a = read<int>(), b = read<int>(), n = read<int>(), s = read<int>(); 96 ll l = 0, r = a; 97 ll res = -1; 98 while(l<=r){ 99 ll mid = l + r>>1; 100 if (mid*n>s) 101 res = mid, r = mid - 1; 102 else 103 l = mid + 1; 104 } 105 if (res==-1){ 106 if (a*n+b>=s) 107 puts("YES"); 108 else 109 puts("NO"); 110 } 111 else{ 112 if ((res-1)*n+b>=s) 113 puts("YES"); 114 else 115 puts("NO"); 116 } 117 } 118 return 0; 119 }
B. Minimize the Permutation
Description
给出一个长为n的序列,一共可以进行n-1个操作,操作$i$可以将序列$a[j],a[j+1]$交换。
求交换后字典序最小的序列。
Solution
卡了很久这个,想想真的憨,后来发现是忘了更新pos值。
每次将最小的值移到尽可能的前面,记录操作了哪些步骤,判断满足大小关系或者当前步骤已经操作过则break
1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <numeric> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 1e5 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 int a[maxn], pos[maxn],vis[maxn]; 88 int main(int argc, char const *argv[]) 89 { 90 #ifndef ONLINE_JUDGE 91 freopen("in.txt", "r", stdin); 92 // freopen("out.txt","w", stdout); 93 #endif 94 int t = read<int>(); 95 while (t--) 96 { 97 n = read<int>(); 98 for (int i = 1; i <= n; i++) 99 { 100 a[i] = read<int>(); 101 pos[a[i]] = i; 102 vis[i] = 0; 103 } 104 int left = n - 1; 105 pos[0] = 0; 106 for (int i = 1; i <n && left; i++) 107 { 108 for (int j = pos[i]-1; j >=1;j--){ 109 if (a[j]<a[j+1]||vis[j]) 110 break; 111 --left; 112 swap(a[j], a[j+1]); 113 swap(pos[a[j]], pos[a[j+1]]); 114 vis[j] = 1; 115 } 116 } 117 for (int i = 1; i <= n; i++) 118 write(a[i]), pblank; 119 puts(""); 120 } 121 return 0; 122 }
C. Platforms Jumping
Description
给出长为n的一条河,以及m个不同长度木板。
小明每次最多可以跳p个单位长度。
问如何安排木板能使小明从0位置安全跳到n+1。
要求木板的交换顺序。
Solution
能否安全跳到最右边很好判定,不过如何安排木板就憨了。
先说一句dyznb。
首先考虑m块木板的总长度为sum,left为n-sum。
即left为小明需要跳跃的距离。
m块木板,加上0和n+1两个点。
一共有m+1个间隙,每个间隙平均分配$left/m$
如果有余数则将前面的部分加一个空隙。
注意判断边界。
1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <numeric> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 1e5 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 int a[maxn], vis[maxn]; 88 int st[maxn]; 89 int main(int argc, char const *argv[]) 90 { 91 #ifndef ONLINE_JUDGE 92 freopen("in.txt", "r", stdin); 93 // freopen("out.txt","w", stdout); 94 #endif 95 n = read<int>(), m = read<int>(), k = read<int>(); 96 int sum = 0; 97 for (int i = 1; i <= m; i++) 98 a[i] = read<int>(), sum += a[i]; 99 int left = n - sum; 100 int mod = left % (m + 1); 101 int div = left / (m + 1); 102 int pdiv = div; 103 if (mod) 104 ++pdiv; 105 if (pdiv >=k||(k==1&&left)) 106 puts("NO"); 107 else 108 { 109 if (left <=m + 1) 110 { 111 112 int mod = left; 113 int now = 1; 114 for (int i = 1; i <= n;i++){ 115 if (mod){ 116 ++i; 117 --mod; 118 } 119 for (int j = i, p = 0; p < a[now]; j++, p++) 120 vis[j] = now; 121 i += a[now] - 1; 122 ++now; 123 } 124 } 125 else 126 { 127 int div = left / (m + 1); 128 int mod = left % (m + 1); 129 int now = 1; 130 for (int i = 1; i <= n;i++) 131 { 132 if (mod) 133 { 134 ++i; 135 --mod; 136 } 137 i += div; 138 for (int j = i, p = 0; p < a[now]; j++, p++) 139 vis[j] = now; 140 i += a[now] - 1; 141 ++now; 142 } 143 } 144 puts("YES"); 145 for (int i = 1; i <= n; i++) 146 write(vis[i]), pblank; 147 puts(""); 148 } 149 return 0; 150 }
D. Binary String Minimizing
Description
给出一个只包含01的字符串,可以进行k次操作。
每次操作可以将任意相邻两个值交换。
问最小的字典序。
Solution
讲道理这个题比BC简单好吧。
直接贪心,将0移到可能移到的最前面。
1 #include <algorithm> 2 #include <numeric> 3 #include <cctype> 4 #include <cmath> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cstring> 8 #include <iostream> 9 #include <map> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 ll n, m, k; 30 const int maxn = 1e6 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 char s[maxn]; 88 int lftz[maxn],lfto[maxn]; 89 int main(int argc, char const *argv[]) 90 { 91 #ifndef ONLINE_JUDGE 92 freopen("in.txt","r", stdin); 93 // freopen("out.txt","w", stdout); 94 #endif 95 fastIO; 96 int t; 97 cin >> t; 98 while(t--){ 99 cin >> n >> k; 100 cin >> s+1; 101 for (int i = 1; i <= n;i++) 102 if (s[i]=='1') 103 lfto[i] = lfto[i - 1] + 1, lftz[i] = lftz[i - 1]; 104 else 105 lftz[i] = lftz[i - 1] + 1, lfto[i] = lfto[i - 1]; 106 for (int i = 1; i <= n&&k;i++) 107 if (s[i]=='0'){ 108 if (lfto[i-1]<=k){ 109 int pre = lftz[i - 1]; 110 swap(s[pre + 1], s[i]); 111 k -=lfto[i - 1]; 112 } 113 else{ 114 swap(s[i], s[i-k]); 115 k = 0; 116 } 117 } 118 cout << s + 1 << " "; 119 } 120 return 0; 121 }
F. Equalizing Two Strings
Description
给出两个字符串s,t,每次可以选择等长的两个不要求相同的字串进行翻转。
问能否将st翻转为相同。
Solution
1,字母数量不同$ ightarrow NO$
2,字母数量相同且存在大于1$ ightarrow YES$
3,字母相同且数目均为1,则考虑两个序列奇偶性是否相同。
1 #include <algorithm> 2 #include <numeric> 3 #include <cctype> 4 #include <cmath> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <cstring> 8 #include <iostream> 9 #include <map> 10 #include <queue> 11 #include <set> 12 #include <stack> 13 #if __cplusplus >= 201103L 14 #include <unordered_map> 15 #include <unordered_set> 16 #endif 17 #include <vector> 18 #define lson rt << 1, l, mid 19 #define rson rt << 1 | 1, mid + 1, r 20 #define LONG_LONG_MAX 9223372036854775807LL 21 #define pblank putchar(' ') 22 #define ll LL 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0) 24 using namespace std; 25 typedef long long ll; 26 typedef long double ld; 27 typedef unsigned long long ull; 28 typedef pair<int, int> P; 29 int n, m, k; 30 const int maxn = 2e5 + 10; 31 template <class T> 32 inline T read() 33 { 34 int f = 1; 35 T ret = 0; 36 char ch = getchar(); 37 while (!isdigit(ch)) 38 { 39 if (ch == '-') 40 f = -1; 41 ch = getchar(); 42 } 43 while (isdigit(ch)) 44 { 45 ret = (ret << 1) + (ret << 3) + ch - '0'; 46 ch = getchar(); 47 } 48 ret *= f; 49 return ret; 50 } 51 template <class T> 52 inline void write(T n) 53 { 54 if (n < 0) 55 { 56 putchar('-'); 57 n = -n; 58 } 59 if (n >= 10) 60 { 61 write(n / 10); 62 } 63 putchar(n % 10 + '0'); 64 } 65 template <class T> 66 inline void writeln(const T &n) 67 { 68 write(n); 69 puts(""); 70 } 71 template <typename T> 72 void _write(const T &t) 73 { 74 write(t); 75 } 76 template <typename T, typename... Args> 77 void _write(const T &t, Args... args) 78 { 79 write(t), pblank; 80 _write(args...); 81 } 82 template <typename T, typename... Args> 83 inline void write_line(const T &t, const Args &... data) 84 { 85 _write(t, data...); 86 } 87 inline int lowbit(int x){ 88 return x & (-x); 89 } 90 struct node{ 91 char ch; 92 int id; 93 node(){} 94 node(char ch,int id){ 95 this->ch = ch; 96 this->id = id; 97 } 98 }; 99 char s1[maxn], s2[maxn]; 100 int main(int argc, char const *argv[]) 101 { 102 #ifndef ONLINE_JUDGE 103 freopen("in.txt","r", stdin); 104 // freopen("out.txt","w", stdout); 105 #endif 106 fastIO; 107 int t; 108 cin >> t; 109 while(t--){ 110 cin >> n; 111 cin >> s1 >> s2; 112 vector<int> num1(26, 0), num2(26, 0); 113 for (int i = 0; i < n;i++) 114 num1[s1[i] - 'a']++, num2[s2[i] - 'a']++; 115 int f = 1; 116 for (int i = 0; i < 26;i++) 117 if (num1[i]!=num2[i]){ 118 f = 0; 119 break; 120 } 121 else{ 122 if (num1[i]>1) 123 f = 2; 124 } 125 if (!f) 126 puts("NO"); 127 else if (f==2) 128 puts("YES"); 129 else{ 130 int f1 = 0, f2 = 0; 131 for (int i = 0; i < n;i++) 132 for (int j = 0; j < i;j++){ 133 if (s1[i]>s1[j]) 134 ++f1; 135 if (s2[i]>s2[j]) 136 ++f2; 137 } 138 if ((f1+f2)%2==0) 139 puts("YES"); 140 else 141 puts("NO"); 142 } 143 } 144 return 0; 145 }