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 2024-07-17 12:03  swj2529411658  阅读(9)  评论(0编辑  收藏  举报

导航