Pdd 2021 第一、二题代码 牛客萌新记录
1.多多的数字组合
多多君最近在研究某种数字组合:
定义为:每个数字的十进制表示中(0~9),每个数位各不相同
且各个数位之和等于N。
满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你--未来的计算机科学家寻求帮助。
#include <stdio.h>
#include <stdbool.h>
bool has_only(int number){
int a[10]={0};
int digist;
while(number>0){
digist=number%10;
if(a[digist]>0){
return false;
}
else{
a[digist]++;
}
number/=10;
}
return true;
}
int main() {
int N;
int i, j;
int min_value;
do {
if (scanf("%d", &N) != 1) {
return -1;
}
} while (N > 1000 || N <= 0);
if (N > 0 && N < 10) {
printf("%d", N);
return 0;
}
if (N>45){
printf("%d",-1);
return 0;
}
if (N==45){
printf("%d",123456789);
return 0;
}
for (i = 1; i < 1e9; i++) {
int temp = i;
int sum = 0;
int con;
while (temp > 0) {
con=temp%10;
sum+=con;
temp /= 10;
}
if (N==sum && has_only(i)){
printf("%d", i);
return 0;
}
else
continue;
}
return 0;
}
2.多多的字符变换
多多君最近在研究字符串之间的变换,可以对字符串进行若干次变换操作:
- 交换任意两个相邻的字符,代价为0。
- 将任意一个字符a修改成字符b,代价为 |a - b|(绝对值)。
现在有两个长度相同的字符串X和Y,多多君想知道,如果要将X和Y变成两个一样的字符串,需要的最少的代价之和是多少。
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
void sort(char str[]){
int n=strlen(str);
int i,j;
int temp;
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(str[j]>str[j+1]){
temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
}
}
}
int main() {
int N;
int i;
int j;
int temp;
do{
if(scanf("%d",&N)!=1){
return -1;
}
}while(N<1 || N>2000);
char X[N+1];
char Y[N+1];
scanf("%s",X);
scanf("%s",Y);
sort(X);
sort(Y);
int sum=0;
for(i=0;i<N;i++){
if(X[i]!=Y[i]){
sum+=abs(X[i]-Y[i]);
}
}
printf("%d",sum);
return 0;
}
查看11道真题和解析