首页 > 其他分享 >CodeForces Round 957 (Div3)

CodeForces Round 957 (Div3)

时间:2024-07-13 15:41:10浏览次数:14  
标签:int cin 957 CodeForces ans Div3 Round

蒟蒻找了一些简单题做了而已,别太在意……

比赛链接

CodeForces Round 957 (Div3)

A. Only Pluses

题意

三个正整数 \(a,b,c\),有五次操作机会。

每次操作:

  • 选取 \(a,b,c\) 中任意一个数,将这个数加上一。

要求最大化 \(a\times b\times c\)。

思路

很直接的贪心题。

假设有三个正整数 \(x,y,z\),给其中的某一个数加上一,那么其乘积就是 \((x+1)yz\) 或 \(x(y+1)z\) 或 \(xy(z+1)\)。

要使乘积最大,那么这个加一的数一定是 \(x,y,z\) 中最小的那个数。

以此类推,五次操作中,我们必须贪心地选取 \(a,b,c\) 中最小的数。

为了省时省力,我们可以用小根堆来维护。

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t,ans=1;cin>>t;
    priority_queue<int,vector<int>,greater<int> >q;
    while(t--){
        ans=1;for(int i=1,x;i<=3;i++)cin>>x,q.push(x);
        for(int i=1,t;i<=5;i++)
            t=q.top(),q.pop(),t++,q.push(t);
        for(int i=1;i<=3;i++)ans*=q.top(),q.pop();
        cout<<ans<<endl;
    }
    return 0;
}

B. Angry Monk

题意

给定长度为 \(k\) 的序列 \(\{a_k\}\) 和正整数 \(n\),保证 \(\sum a_i=n\),每次可以进行一下两种操作:

  • 选定一个 \(a_i(a_i>1)\),将其分裂成 \(a_i-1\) 和 \(1\)。

  • 选定 \(a_i\) 和 \(a_j\),满足 \(a_i=1\),将 \(a_i\) 和 \(a_j\) 合并为一个 \(a_j+1\)。

求将序列长度变为 \(1\) 的最小操作次数。

思路

依然是贪心

如果两个数可以合并,当且仅当其中一个数为 \(1\)。

考虑 \(k=2\) 的情况,假设序列中两个元素为 \(p,q(p>q)\),那么它的最小操作步数就是 \(2q-1\),即先将 \(q\) 分裂为 \(q\) 个 \(1\),再让这 \(q\) 个 \(1\) 与 \(p\) 合并。

以此类推,我们可以将序列先排序,把其中最小的 \(k-1\) 个元素分别分解为 \(1\),在让它们和最大的元素合并。

这样就能做了。

但继续想想,可以想到一个公式:

\[ans=n-\max\{a_i\}-(k-1)+n-\max\{a_i\} \]

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k,a[100001];
void solve(){
    cin>>n>>k;for(int i=1;i<=k;i++)cin>>a[i];
    sort(a+1,a+k+1);
    cout<<n-a[k]-(k-1)+n-a[k]<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t;cin>>t;while(t--)solve();
    return 0;
}

标签:int,cin,957,CodeForces,ans,Div3,Round
From: https://www.cnblogs.com/snapyust/p/18300198

相关文章

  • Codeforces Round 957 (Div. 3) A-G 题解
    CodeforcesRound957(Div.3)A-G题解A.OnlyPluses枚举思路:枚举\(a\),\(b\),\(c\)增加的次数,维护最值即可。代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#definepbpush_back#defineall(u)u.begin(),u.end()#......
  • CodeForces - 1984F
    分析考虑相邻两个字符带来的约束。若为"SS",则满足$|b_i-b_{i+1}|\lem$若为"PP",则满足\(|b_{i+1}-b_i|\lem\)若为"PS",则满足\(tot_a=b_i+b_{i+1}\)若为"SP",则满足\(tot_a+a_{i}+a_{i+1}=b_i+b_{i+1}\)发现可以枚举"PS"的位置来确定\(to......
  • Codeforces Round 957 (Div. 3)
    E-Novice'sMistake题意为寻找n*a-b=("n"+"n"+...){a个n的字符串-b的长度}即为"2"⋅20−18="22222222222222222222"−18=22=2⋅20−18使用暴力枚举每个n相加的长度和又因为n<=100a<=100000所有答案t的值必定小于1e6所以对每个a进行枚举对于每个答案t进行判断是否成立其......
  • CodeForces - 1987F1 & CodeForces - 1987F2
    分析首先显然有dp状态\(g_i\)表示前\(i\)个数,能进行最大的操作次数。转移有\(g_i=\max\limits_{j=1}^{i-1}(g_j+\frac{i-j}{2})[2|(i-j)]\)但这里显然缺少转移条件。经过基本观察,发现若\(i\)操作过,满足条件:\(a_i\equivi(mod\2)\)\(i\)左侧操作过\(\frac{i-......
  • Codeforces Round 957 (Div. 3)
    推荐个C++编程仓库模板https://github.com/yxc-s/programming-templateA.OnlyPluses总结:为什么优先增加最小的数,它们的乘积会是最优的呢?可以这么理解,假如只有两个数a和b,b>a,那么a+1,就增加一份b。如果b+1,只能增加1份a。因为b>a,所以增加小的数是最优的。voidsolve(){......
  • Codeforces Round #956 (Div. 2)题解
    A.ArrayDivisibility需要让满足$k\midj$的所有\(a_j\)的和整除k,只需要让每个\(a_j\)整除k就可以了,可以让\(a_j=j\)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'typedefpair<int,int>pii;typedefunsignedlonglo......
  • CodeForces - 1986G1 & CodeForces - 1986G2
    经过基本观察,可得当点对\((i,j)\)合法时,有\(a_i|b_j,a_j|b_i\),其中\(a_i=i/gcd(p_i,i),b_i=p_i/gcd(p_i,i)\),证明显然。如何维护?考虑开\(mp_{x,y}\)表示\(x=a_i\),\(y|b_i\)的个数。对于点\(i\)点对个数即为\(\sum\limits_{d|b_i}mp_{d,a_i}\)时间复杂度为\(O(nlog......
  • CodeForces - 1984E
    题目大意每次在每个联通块中选一个点\(u\),删除这个点使得联通块分成若干个联通块,再从联通块中选点\(v\),在新树上连接\(u,v\),求新树叶节点的最大个数。分析易转化为求原树的最大独立集,设\(f_{u,0/1}\)为以1为根时不选/选\(u\)的最大独立集。显然有:\[dp_{u,0}=\sum\li......
  • 高考后第一次Codeforces Round 952 (Div. 4)
    ACreatingWords思路:拿一个容器交换两数值即可#include<bits/stdc++.h>usingnamespacestd;constintN=100001;chara[N],b[N];intmain(){intn;scanf("%d",&n);while(n--){scanf("%s%s",a,b);charjia......
  • 研0 冲刺算法竞赛 day14 P1957 口算练习题
    思路:分别考虑以运算符或数字开头,为运算符,直接读入后面两个数字;为数字,在读入一个数字即可代码:#include<iostream>#include<cstring>#include<cstdio>usingnamespacestd;intmain(){ intN; cin>>N; charc[10],str[55],f; while(N--) { cin>>c; int......