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;
}



京公网安备 11010502036488号