A. Maximum Cake Tastiness 排序取最大的两个即可
void slove()
{
int n;cin>>n;
int a[n+5];
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0;
sort(a+1,a+n+1);
ans+=a[n]+a[n-1];
cout<<ans<<endl;
}
B. Prefix Removals 从前往后判断,直到当前字符在后面不再出现
void slove()
{
string s;cin>>s;
string s1="";
map<char,int>mp;
int a[s.size()+2];
memset(a,0,sizeof a);
for(int i=0;i<s.size();i++){
mp[s[i]]++;
a[i]=mp[s[i]];
}
int flag=-1;
for(int i=0;i<s.size();i++){
if(mp[s[i]]-a[i]==0){
flag=i;
break;
}
}
for(int i=flag;i<s.size();i++)cout<<s[i];
cout<<endl;
}
C. Alice and the Cake dfs将数一直分开即可,遇到出现过的就不往下搜索,同时数字的数量减一,当遍历完正好等于0 的时候说明成功
map<int,int>mp;
int flag=0;
int m=0;
void dfs(int n){
if(flag) return ;
if(mp[n]>0){
mp[n]--;
m--;
return ;
}
else{
if(n==1){
flag=1;
return ;
}
else{
int a=n/2;
int b=(n+1)/2;
dfs(a);
dfs(b);
}
}
}
void slove()
{
int n;cin>>n;
int a[n+5];
int sum=0;
mp.clear();
for(int i=0;i<n;i++) {
cin>>a[i];
sum+=a[i];
mp[a[i]]++;
}
if(n==1){
YES;
return ;
}
flag=0;
m=n;
dfs(sum);
if(m==0&&flag==0) YES;
else NO;
}
|