专栏文章
P13707 Higher Arithmetic 题解
P13707题解参与者 4已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @min1tz0p
- 此快照首次捕获于
- 2025/12/01 19:11 3 个月前
- 此快照最后确认于
- 2025/12/01 19:11 3 个月前
1. 题意解释
给出 个数,使用加号乘号括号组成一个合法表达式,使得表达式的值最大,你只需要输出这个表达式。
2. 思路
假如没有 时,我们容易知道将所有数相乘显然是更优的。
假如有 时,我们还需要考虑 的情况。
如果 的个数小于等于 的个数,我们把 和 两两相加,剩余全部相乘。
如果 的个数大于 的个数,依然是先把 和 两两配对,对剩余的 作讨论。
记 的个数为 。
若 ,则将 与剩余数中的最小值相加。
若 且 ,则我们拆成 个 和 个 。
若 ,则我们拆成 个 和 个 。
若 ,则我们拆成 个 。
然后将所有的这些数两两相乘即可。
最后步骤就是极其麻烦的表达式输出……
Hack 数据很多,造几个 和 可以帮你查出大部分错误。
3. 代码实现
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[100100],cnt1,cnt2;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(a[i]==1){
cnt1++;
}
if(a[i]==2){
cnt2++;
}
}
if(n==1){
cout<<a[1];
}
else{
if(cnt1<=cnt2){
if(cnt1>0){
if(cnt2>0){
cout<<"(1+2)";
for(int i=1;i<=cnt1-1;i++){
cout<<"*(1+2)";
}
for(int i=cnt1*2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
else{
cout<<a[1];
for(int i=2;i<=n;i++){
cout<<"*"<<a[i];
}
}
}
else{
for(int i=1;i<n;i++){
cout<<a[i]<<"*";
}
cout<<a[n];
}
}
else{
int cnt=cnt1-cnt2;
if(cnt%3==1){
if(cnt==1){
if(cnt2>0){
cout<<"(1+1+2)";
for(int i=1;i<=cnt2-1;i++){
cout<<"*(1+2)";
}
for(int i=1;i<=cnt/3-1;i++){
cout<<"*(1+1+1)";
}
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
else{
cout<<"(1+"<<a[2]<<")";
for(int i=3;i<=n;i++){
cout<<"*"<<a[i];
}
}
}
else{
if(cnt2>0){
cout<<"(1+2)";
for(int i=1;i<=cnt2-1;i++){
cout<<"*(1+2)";
}
for(int i=1;i<=cnt/3-1;i++){
cout<<"*(1+1+1)";
}
cout<<"*(1+1)*(1+1)";
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
else{
if(cnt/3>1){
cout<<"(1+1+1)";
for(int i=1;i<=cnt/3-2;i++){
cout<<"*(1+1+1)";
}
cout<<"*(1+1)*(1+1)";
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
else{
cout<<"(1+1)*(1+1)";
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
}
}
}
if(cnt%3==2){
if(cnt2>0){
cout<<"(1+2)";
for(int i=1;i<=cnt2-1;i++){
cout<<"*(1+2)";
}
if(cnt/3>0){
cout<<"*";
for(int i=1;i<=cnt/3;i++){
cout<<"(1+1+1)*";
}
cout<<"(1+1)";
}
else{
cout<<"*(1+1)";
}
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
else{
for(int i=1;i<=cnt/3;i++){
cout<<"(1+1+1)*";
}
cout<<"(1+1)";
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
}
if(cnt%3==0){
if(cnt2>0){
cout<<"(1+2)";
for(int i=1;i<=cnt2-1;i++){
cout<<"*(1+2)";
}
for(int i=1;i<=cnt/3;i++){
cout<<"*(1+1+1)";
}
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
else{
cout<<"(1+1+1)";
for(int i=1;i<=cnt/3-1;i++){
cout<<"*(1+1+1)";
}
for(int i=cnt1+cnt2+1;i<=n;i++){
cout<<"*"<<a[i];
}
}
}
}
}
return 0;
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...