A. Only Pluses
题目类型:贪心。
解题思路:显然,每次令最小的数加1所得的最后乘积最大。由于数据很小,用5次排序即可。
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
void solve(){
int a[3];
cin>>a[0]>>a[1]>>a[2];
for(int i=1;i<=5;i++){
sort(a,a+3);
a[0]++;
}
cout<<a[0]*a[1]*a[2]<<'\n';
}
int main()
{
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
B. Angry Monk
题目类型:贪心。
解题思路:最长的土豆不变,其余的分成长度为1的土豆,再接到最长的土豆上。最少的操作数为ans=(为除去最长的土豆的其他土豆),即ans=2*(n-maxl)-k+1(maxl为最长的土豆长度)。
AC代码:
#include<iostream>
using namespace std;
typedef long long LL;
void solve()
{
LL n,k,a,maxl=0;cin>>n>>k;
for(int i=1;i<=k;i++){
cin>>a;
maxl=max(maxl,a);
}
LL ans=2*(n-maxl)-k+1;
cout<<ans<<'\n';
}
int main()
{
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
C. Gorilla and Permutation
题目类型:构造。
解题思路:对于a[i]>=k,其对的贡献为(n-i+1)*a[i];对于a[i]<=m,其对的贡献为(n-i+1)*a[i]。要使最小,则应将大于k的数倒序放在数组最前,小于m的数正序放在数组最后。
AC代码:
#include<iostream>
using namespace std;
void solve(){
int n,m,k;cin>>n>>m>>k;
for(int i=n;i>m;i--){
cout<<i<<' ';
}
for(int i=1;i<=m;i++){
cout<<i<<' ';
}
cout<<'\n';
}
int main()
{
int t;cin>>t;
while(t--){
solve();
}
return 0;
}
D. Test of Love
题目类型:dp,贪心。
解题思路:用dp[i]表示当前游过的距离,显然能够从一个陆地跳到另一个陆地的两个陆地dp[i]相等。预处理L数组存放每个位置的一个能跳跃到当前位置的陆地的下标,若没有能跳到当前位置的陆地,记为null。则有状态转移方程:
if(L[i]!=null)
if(a[i-1]=='W') dp[i]=max(dp[i-1]+1,dp[L[i]]);
else dp[i]=dp[L[i]];
else if(a[i-1]=='W') dp[i]=dp[i-1]+1;
else dp[i]=null (表示不可能到该位置)
如果dp[n]==null or dp[n]>k,则不可能游到对岸。
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=200010,null=0x3f3f3f3f;
int dp[N],L[N];
char a[N];
void solve()
{
memset(L,0x3f,sizeof L);
memset(dp,0x3f,sizeof L);
int n,m,k;
cin>>n>>m>>k;
scanf("%s",a);
int tmp=0;
//处理从左岸能跳到的位置
for(int i=tmp;i<m && i<=n;i++){
L[i]=-1;
tmp++;
}
//处理从其他陆地能跳到的位置
for(int i=0;i<n;i++){
if(a[i]=='L'){
for(int j=tmp;j<=i+m && j<=n;j++){
L[j]=i;
tmp++;
}
}
}
dp[0]=0;
for(int i=1;i<=n;i++){
if(L[i]!=null){
if(a[i-1]=='W'){
dp[i]=min(dp[i-1]+1,dp[L[i]]);
}
else{
dp[i]=dp[L[i]];
}
}
else if(a[i-1]=='W'){
dp[i]=dp[i-1]+1;
}
else{
cout<<"NO\n";
return;
}
}
if(dp[n]<=k){
cout<<"YES\n";
}
else{
cout<<"NO\n";
}
}
int main()
{
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}