C、小红的数字拆解
思路:从前往后判断每个位置是不是偶数,若是,就将其分割输出;不是,将其与下一位相加继续判断。注意:排序不能直接用sort,但直接sort是按字典序排序,对于"12","4",是无法比大小;所以要重载cmp。
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
if(a.length()==b.length()){
return a<b;
}
return a.length()<b.length();
}
int main(){
string s;
cin>>s;
vector<string>x;
string temp;//temp为判断对象
for(int i=0;i<s.size();i++){
temp+=s[i];
if((s[i]-'0')%2==0){
x.push_back(temp);
temp="";
}
}
sort(x.begin(),x.end(),cmp);
for(auto i:x) cout<<i<<endl;
return 0;
}
D、小红的陡峭值
思路:需要考虑全情况,对于陡峭值为1的数组只有两种情况,第一种:前面小后面大,如“1111222”;第二种前面大后面小,如“2221111”。这两种情况都只有最大值与最小值相差一才能成立。剩下的情况输出-1就好了。
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
if(a[0]!=0&&a[n-1]!=0){//排除:1 0 0 0 0 1
if(abs(a[0]-a[n-1])!=1){
cout<< -1;
return 0;
}
}
int Min=2e9,Max=1;//初始化最小值和最大值
for(int i=0;i<n;i++){
if(a[i]==0) continue;
Max=max(Max,a[i]);
Min=min(Min,a[i]);
}
if(Max-Min==1){
vector<int>v1,v2;
for(int i=0;i<n;i++){
if(a[i]==0)continue;
if(a[i]==Min) v1.push_back(i);
if(a[i]==Max) v2.push_back(i);
}
if(v1.back()<v2[0]){
for(int i=0;i<=v1.back();i++) cout<<Min<<" ";
for(int i=v1.back()+1;i<n;i++) cout<<Max<<" ";
}
else if (v2.back()<v1[0]) {
for(int i=0;i<=v2.back();i++) cout<<Max<<" ";
for(int i=v2.back()+1;i<n;i++) cout<<Min<<" ";
}
else{
cout<< -1;
}
}
else if(Max==Min){
if(a[0]==0){
cout<<Min+1<<" ";
for(int i=0;i<n-1;i++) cout<<Min<<" ";
}
else{
for(int i=0;i<n-1;i++)cout<< Min<<" ";
cout<<Min+1<<" ";
}
}
else if(Min>1e9){//代表全为0的情况
cout<<1<<" ";
for(int i=0;i<n-1;i++) cout<<2<<" ";
}
else {
cout<< -1;
}
return 0;
}
E、小红的树形DP(*)
思路:二分图(原因是两种字符)。
#include<bits/stdc++.h>
using namespace std;
string s;
int dp[202020];
vector<int>g[101010];
void dfs(int x,int pr,int p){
dp[x]=p;
for(auto i:g[x]){
if(i==pr)continue;
dfs(i,x,1-p);
}
}
int main(){
int n,i;
cin>>n;
cin>>s;
for(i=1;i<n;i++){
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
s=' '+s;
dfs(1,0,1);
set<int>d,p;
for(i=1;i<=n;i++){
if(s[i]=='d')d.insert(dp[i]);
if(s[i]=='p')p.insert(dp[i]);
}
if(d.size()>1||p.size()>1){
cout<<-1;
return 0;
}
else if(d.size()==1&&p.size()==1&&(*d.begin())==(*p.begin())){
cout<<-1;
return 0;
}
if((*d.begin()==1)){
for(i=1;i<=n;i++){
if(dp[i]==1)cout<<'d';
else cout<<'p';
}
}
else{
for(i=1;i<=n;i++){
if(dp[i]==1)cout<<'p';
else cout<<'d';
}
}
}