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

E. Novice's Mistake

posted on   swj2529411658  阅读(10)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示