试了一下手,大受打击!!
题目一:
多多君最近在研究某种数字组合:
定义为:每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。
满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你--未来的计算机科学家寻求帮助。
#include<bits/stdc++.h>
using namespace std;
int ans = 987654321;
int flag[9]={0};
void trans(int m, int sum, int n){
if(sum == n){
if(ans > m ) ans = m;
return ;
}
if(sum > n || m > ans){
return ;
}
for(int i = 9; i>0; i--){
if(flag[i] == 0){
flag[i] = 1;
trans(m*10+i, sum +i, n);
flag[i] = 0;
}
}
return ;
}
int main(){
int n;
cin >> n;
if(0 <= n && n <= 9) cout << n << endl;
else{
trans(0, 0, n);
if(ans == 987654321)cout << -1 << endl;
else cout << ans << endl;
}
return 0;
}
题目不难,自己的问题主要在两个方面(不该错)
1.题意不明,没有发现是各不相同的数字,一开始就不过
2.最大ans没找到,不是9999,而是所有数据组合的最大
题目二:
多多君最近在研究字符串之间的变换,可以对字符串进行若干次变换操作:
- 交换任意两个相邻的字符,代价为0。
- 将任意一个字符a修改成字符b,代价为 |a - b|(绝对值)。
现在有两个长度相同的字符串X和Y,多多君想知道,如果要将X和Y变成两个一样的字符串,需要的最少的代价之和是多少
#include <bits/stdc++.h>
using namespace std;
int ans =0 ;
int main(){
int n;
cin >> n;
string a, b;
cin >> a >> b;
sort(a.begin(), a.end());
sort(b.begin(), b.end());
for(int i =0; i < n; i++){
if(a[i] != b[i]) ans += abs(a[i]-b[i]);
}
//trans(a, b, 0, 0, n);
cout << ans << endl;
return 0;
}
这个题目很简单,只不过让我想复杂了,这种数据转化的题目在之前看到过!!一定要先排序!!!
我本来想用两种方法的回溯,但是回溯法这里存在交换为0的情况,很不划算,可能会死循环
题目三:
多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。
多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的。
现在多多鸡想请你帮忙计算一下,满足和谐条件的区间的数量。
这道题目就开始上难度了,ac一半还是可以的(用滑动窗口)
#include <bits/stdc++.h>
using namespace std;
int s[101];
int main(){
int n, m;
cin >> n >> m;
int a;
long long ans = 0;
int sum =0;
for(int i = 0; i <n; i++){
cin >>a;
sum += a;
sum = sum%m;
ans += s[sum];
s[sum] ++;
if(sum == 0) ans++;
}
cout << ans << endl;
return 0;
}
这个用的比较巧妙,主要是通过前缀和s[i],如果s[i]==s[j] 那么a[i]-a[j]就可以被整除,因为余数相同被剪掉了,或者从头到i 的sum为0 ,也是一个答案,最后是longlong
多多君拼团购买了N个骰子,为了方便后面进行活动,多多君需要将这些骰子进行分类。
两个骰子为同类的定义是:
1 |
|
现在多多君想知道不同种类的骰子的数量分别有多少。
据说很难,日后补充