A.String
题意:
给一个字符串,将字符串拆成尽可能少的几个字典序最小的字符串
举例: "0101" is perfect as it is the smallest string among ("0101", "1010", "0101", "1010").后面的字符插到第一个位置
111011110 答案 :111 01111 0(111 在字符串111的字典序是最小的,其他也一样)
不可以将每个字符拆开,要求字符串数量尽可能小, 比如1110 在这个字符串中,0111比1110小,
题解:
暴力模拟,将字符串拆分,然后组装,判断是否是最小,如果不是,向前推
#include <bits/stdc++.h>
using namespace std;
bool check(string u){
string p = "";
int len = u.size();
for(int i = 1; i < len; i++){
p = u.substr(i, len-i) + u.substr(0, i);
if(u > p){
return false;
}
}
return true;
}
int main(){
int t;
cin >> t;
while(t--){
string s;
cin >> s;
int len = s.size();
int l = 0, r = len;
while(1){
for(int i = r; i >= 0; i--){
string tmp;
tmp = s.substr(l, i);
//cout << "截取字符串:"<< tmp<<" 左边界 " << l << " 长度 " << i <<" "<<r<< endl;
if(check(tmp)){
l += i;
r = len-l;
cout << tmp << " ";
break;
}
}
if(l == len){
break;
}
}
cout << endl;
}
return 0;
}
B.Irreducible Polynomial
题意:
给出一个多项式,问是否还能进行拆分
题解:
当 n 大于2时,一定可以再拆分
当n小于2时,一定不可以再拆分
当 n等于 2时,判断与x轴是否有交点(判断是否有解),如果有,能,否则不能
#include<iostream>
#include<cstdio>
using namespace std;
int t, n;
long long a[25];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d", &n);
for(int i = n; i >= 0;i--){
scanf("%lld", &a[i]);
}
if(n < 2){
printf("Yes\n");
}
else if(n > 2){
printf("No\n");
}
else{
if(a[1] * a[1] - 4 * a[0] * a[2] < 0){
printf("Yes\n");
}
else{
printf("No\n");
}
}
}
return 0;
}
J.A+B problem
题意:
f(n) 表示对n取反, f(12345) = 54321, 求 f ( f (A) + f (B) )
题解:
模拟,将A B 翻转后相加,然后逆序输出
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int t;
cin >> t;
while(t--){
string s1, s2;
cin >> s1 >> s2;
int len1 = s1.size();
int len2 = s2.size();
ll sum1 = 0, sum2 = 0;
for(int i = len1-1; i >= 0; i--){
sum1 = sum1 * 10 + (s1[i] -'0');
}
for(int i = len2 - 1; i >= 0; i--){
sum2 = sum2 * 10 + (s2[i] - '0');
}
ll sum = sum1 + sum2, k = 1;
while(sum){
while(k == 1 && sum % 10 == 0){
sum = sum / 10;
}
cout << sum % 10;
sum = sum / 10;
k = 2;
}
cout << endl;
}
return 0;
}