Codeforces Round 957 (Div. 3)
A.Only Pluses
题意:给定三个数,每次可以选定一个数加一,最多操作五次,求乘积的最大值。
题解:每次选最小的数加一。
#include<bits/stdc++.h>
using namespace std;
int main()
{
priority_queue<int, vector<int>, greater<int> > q;
int t;
cin>>t;
while(t--)
{
int a,b,c;
cin>>a>>b>>c;
q.push(a);
q.push(b);
q.push(c);
for(int i=1;i<=5;i++)
{
int num = 0;
num=q.top();
q.pop();
num+=1;
q.push(num);
}
long long ans=1;
while(!q.empty())
{
ans*=q.top();
q.pop();
}
cout<<ans<<endl;
}
return 0;
}
B. Angry Monk
题意:每次选一个碎片 ai,分解为 1 和 a i-1或者选一个碎片和1相加,问最后需要经过多少次操作才可以把所有碎片合成一个。
题解:从小到大排序,选最小的x,经过x-1次分解为x个1,在经过x次把所有1加到最大的碎片上去。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long n,k;
priority_queue<int, vector<int>, greater<int> > q;
cin>>n>>k;
int num=0;
long long ans=0;
for(int i=1;i<=k;i++)
{
cin>>num;
q.push(num);
}
while(q.size()!=1)
{
int a=q.top();
ans=ans+a+a-1;
q.pop();
}
cout<<ans<<endl;
}
return 0;
}
C. Gorilla and Permutation
题意:给你一个n,m,k,然后f(i)是前i个数里面不小于k的值的和,因此前面就从大到小倒着来就可以,然后当轮到倒数第m个后,要从前往后来,确保前面的数更小,累加值更大。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b,c;
cin>>a>>b>>c;
for(int i=a;i>b;i--)
{
cout<<i<<" ";
}
for(int i=1;i<=b;i++)
{
cout<<i<<" ";
}
cout<<endl;
}
return 0;
}
D、E之后更新。