A
模拟
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx 2000
#define mod 1000000009
#define int long long
int v,e,k,a,b,n,m,t,x,y,l,r,neww,neww2,w,ans=0,q,noww,ans1,ans2;
int all[maxx];
string s;
signed main()
{
    cin>>n;
    for(int i=1;i<=n;++i) cin>>all[i];
    cin>>s;
    for(int i=1;i<=n;++i)
    {
      if(s[i-1]=='F') ans=ans+max((int)5,all[i]/100);
      else ans=ans+all[i];
    }
    cout<<ans;
    
}
B
注意只能单个之间交换,而不是整体的交换,将大的放在一侧,这样的答案最优,因为考虑在这种答案上交换,发现会使得乘积和变小。
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx 2000000
#define mod 1000000007
#define int long long
int v,e,k,a,b,n,m,t,x,y,l,r,neww,neww2,w,ans=0,q,noww,ans1,ans2;
int all1[maxx];
int all2[maxx];
string s;
signed main()
{
    cin>>n;
    for(int i=1;i<=n;++i) cin>>all1[i];
    for(int i=1;i<=n;++i) cin>>all2[i];
    for(int i=1;i<=n;++i)
    if(all1[i]<all2[i]) 
        swap(all1[i],all2[i]);

    int ans1=1;
    int ans2=1;
    for(int i=1;i<=n;++i)
    {ans1=(ans1*all1[i])%mod;
    ans2=(ans2*all2[i])%mod;
    }
    cout<<(ans1+ans2)%mod;
    
}
C
先使用2,倒着依次使用2,且保证使用后没有小于0的,因为一旦有一个小于0的,那么消耗5点只能造成小于等于5点的伤害,不如使用1。
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define maxx 100000
#define mod 1000000009
#define int long long
int v,e,k,a,b,n,m,t,x,y,l,r,neww,neww2,w,ans=0,q,noww,ans1,ans2;
string s;
int all[maxx];
signed main()
{
    cin>>n;
    for(int i=1;i<=n;++i) 
    cin>>all[i];
      
    
    //sort(all+1,all+1+n,cmp);
    for(int i=n;i>=1;--i)
    {
        int x=min(all[i],min(all[i+1]/2,all[i+2]/3));
        ans=ans+x*5;
        all[i]=all[i]-x;
        all[i+1]=all[i+1]-2*x;
        all[i+2]=all[i+2]-3*x;
      
    }

     for(int i=1;i<=n;++i)
    ans=ans+all[i];
    cout<<ans;
    
}