文章目录
- C题.[Codeforces 146C] Lucky Conversion
- D题.[Codeforces 146D] Lucky Number 2
C题.[Codeforces 146C] Lucky Conversion
题目链接
思路: 从a,b串不一样的所有位置 i 里,记录a[i]==4的数量cnt_4,和a[i]==7的数量cnt_7,方案肯定是能交换的交换,最后不能交换的改变。所以ans=min(cnt_4,cnt_7)+(max(cnt_4,cnt_7)-min(cnt_4,cnt_7)) = max(cnt_4,cnt_7);
//AC代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
string a,b;
int cnt4,cnt7;
int main(){cin>>a>>b;int len=a.length();for(int i=0;i<len;i++){if(a[i]!=b[i]){if(a[i]=='4')cnt4++;else cnt7++;}}cout<<max(cnt4,cnt7);
}
D题.[Codeforces 146D] Lucky Number 2
题目链接
思路: 手动构造一下不难看出来如果|a3-a4|>1,肯定无解。
所以分三种情况,a3=a4; a3=a4-1; a4=a3-1
①a3=a4时,有47474或者74747两种形式。
— 显然,如果满足a1>=a3+1且a2>=a3,选用47474的形式构造最优,否则,如果满足a1>=a3且a2>=a3+1,能且只能选用74747的形式构造,再否则,无解。
②a3=a4-1时,如果满足a1>=a4且a2>=a4,能且只能选用747474的形式构造,否则无解。
③a4=a3-1时,如果满足a1>=a3且a2>=a3,能且只能选用474747的形式构造,否则无解。
如果不满足以上三种情况之一,无解
if-else判断选择形式进行构造即可,“4"和"7"如果有多余的,只需要在构造的时候,算出有多少多余的"4"和"7”,然后把多余的"4"放到所选构造形式的最左边的"4"旁边输出,把多余的"7"放到所选构造形式的最右边的"7"旁边输出,显然这样得出的结果满足最小化。
//AC代码
#include<bits/stdc++.h>
using namespace std;
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
int a1,a2,a3,a4;
void solve(){if(a3==a4){if(a1>=a3+1&&a2>=a3){for(int i=1;i<=a1-(a3+1);i++)printf("4");for(int i=1;i<=a3;i++)printf("47");for(int i=1;i<=a2-a3;i++)printf("7");printf("4");return;}elseif(a1>=a3&&a2>=a3+1){printf("7");for(int i=1;i<=a1-a3;i++)printf("4");for(int i=1;i<=a3;i++)printf("47");for(int i=1;i<=a2-(a3+1);i++)printf("7");return;}else return void(cout<<-1);}elseif(a3==a4-1){if(a1>=a4&&a2>=a4){printf("74");for(int i=1;i<=a1-a4;i++)printf("4");for(int i=1;i<=a4-2;i++)printf("74");for(int i=1;i<=a2-a4;i++)printf("7");printf("74");return;}else return void(cout<<-1);}if(a4==a3-1){if(a1>=a3&&a2>=a3){for(int i=1;i<=a1-a3;i++)printf("4");for(int i=1;i<=a3;i++)printf("47");for(int i=1;i<=a2-a3;i++)printf("7");return;}else return void(cout<<-1);}else return void(cout<<-1);
}int main(){cin>>a1>>a2>>a3>>a4;solve();
}