Codeforces Round 957 (Div. 3)
知识点
1.几个数相乘时,更小的数增加会比更大的数增加得到的乘积来得大
题解
A. Only Pluses
1.几个数相乘时,当更小的数增大时,得到的乘积会比更大的数增大来得大,也就是更小的数字权重会比较大,那么在5次+1的过程中,每次找最小值++即可
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
void solve()
{
int a,b,c; cin>>a>>b>>c;
int minn=1e9;
for(int i=0;i<5;i++)
{
minn=min({a,b,c});
if(a==minn) a++;
else if(b==minn) b++;
else if(c==minn) c++;
}
cout<<a*b*c<<endl;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int t=1;
cin>>t;
while(t--) solve();
return 0;
}
B. Angry Monk
1.把元素从小到大排序以后,拆开那些不是1的,假设数字为k,需要k-1次,拆完以后,合并需要的次数为除最后一个元素外所有元素加起来
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
signed main()
{
int t=1;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
vector<int>ve(k);
for(int i=0;i<k;i++) cin>>ve[i];
sort(all(ve));
int ans=0,sum=0;
for(int i=0;i<k-1;i++)
{
ans+=ve[i]-1;
sum+=ve[i];
}
ans+=sum;
cout<<ans<<endl;
}
}
C. Gorilla and Permutation
1.简单的构造,只要让最大值排在第一个,可以保证fi的和尽量大,让m排在最后一个,可以保证gi的和尽量小,然后左边递减,右边递减,直到用完所有元素即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define x first
#define y second
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
signed main()
{
int t=1;
cin>>t;
while(t--)
{
int n,m,k;
cin>>n>>m>>k;
int cnt=n-m;
int te=n;
int ts=1;
for(int i=0;i<n-m;i++) cout<<te--<<" ";
for(int i=0;i<m;i++) cout<<ts++<<" ";
cout<<endl;
}
}
D. Test of Love
1.如果可以跳到岸边就直接跳,如果不行,我们就要寻找可以跳的木头,当下一个木头无法抵达的时候,跳到水里,就检查游泳的距离够不够,或者有无鳄鱼即可。尽可能跳的远以避开鳄鱼,并尽可能少游泳
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
void solve()
{
int n,m,k; cin>>n>>m>>k;
string s; cin>>s;
vector<int>p;
for(int i=0;i<n;i++)
{
if(s[i]=='L') p.push_back(i);
}
p.push_back(n);
int i=-1;//当前位置
int pos=0;//代表下一个木头的位置
while(i<n-1)
{
if(m>=p[pos]-i) i=p[pos]; //下一个木头的位置到当前位置的距离小于m
else {
i+=m;//跳不到下一个木头或者没木头直接跳到终点了
if(i>n-1){
cout<<"YES"<<endl;
return ;
}
//到下一个木头前只能游泳
while(i<n&&i<p[pos]){
if(s[i]!='C'&&k>0){//当没有鳄鱼的时候可以游,且不能游超过k
i++;
k--;
}else{
cout<<"NO"<<endl;
return ;
}
}
}
pos++;
}
cout<<"YES"<<endl;
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int t=1;
cin>>t;
while(t--) solve();
return 0;
}
posted on 2024-07-17 12:03 swj2529411658 阅读(9) 评论(0) 编辑 收藏 举报