AtCoder Beginner Contest 101
A - Eating Symbols Easy
大意:
一开始是0,四个符号,-是-1,+是+1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
string s;
int main() {
cin >> s;
int res = 0;
for (int i = 0; i < 4;i++)
if (s[i] == '-') res--;
else
res++;
cout << res << endl;
return 0;
}
B - Digit Sums
大意:
数位和能不能整除这个数
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int n,tmp,sum;
int main(){
cin >> n;
tmp = n;
sum = 0;
while(tmp){
sum += tmp % 10;
tmp /= 10;
}
if (n % sum==0) cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
C - Minimization
大意:
给出一个n的全排列,每次可以选择k个数,将这k个数用k个数里面的最小值替换,问操作多少次可以将n个数变为相等的数
思路:
直接从左到右顺着变换即可,注意分类讨论一下k=2的情况
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int n, k, x;
int main() {
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> x;
if (k >= n)
cout << 1 << endl;
else if(k==2)
cout << n - 1 << endl;
else if (n % (k - 1) == 1 || n % (k - 1) == 0)
cout << n / (k - 1) << endl;
else
cout << n / (k - 1) + 1 << endl;
return 0;
}
D - Snuke Numbers
大意:
定义Snuke number n为对于所有大于n的数m,都有:n/n的数位和<=m/m的数位和
输入一个数k,输出前k小的Snuke number
思路:
打表,然后发现基本后面的位都是9,但是最高位可能是1-9,也有可能是10-99,再往后就没打出来了,所以只能根据这个不是规律的规律进行构造,然后判断再输出即可。
p为最高位,q为位数:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
LL n;
LL get(LL x) {
LL sum = 0;
while (x) {
sum += x % 10;
x /= 10;
}
return sum;
}
LL num = 0;
int main() {
cin >> n;
LL p = 2, q = 1;
while (n) {
LL now = p * q - 1;
LL ne = ceil(1.0 * p / 10) * q * 10 - 1;
if (now * get(ne) > ne * get(now)) {
p = ceil(1.0 * p / 10);
q *= 10;
} else {
cout << now << endl;
n--;
p++;
}
}
return 0;
}