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