ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

刷题记录 【Ternary Sequence】

2020-08-29 22:04:21  阅读:256  来源: 互联网

标签:数列 Sequence int 个数 else 剩下 Ternary ans 刷题


原题链接:CF1401B Ternary Sequence

题目大意:

给出\(n\)组数据,每一组数据有两行,第一行为\(x_1,y_1,z_1\),分别代表的是数列\(A\)中\(0,1,2\)的个数,第二行为\(x_2,y_2,z_2\),分别代表的是数列\(B\)中\(0,1,2\)的个数。\(A\)和\(B\)数列中的\(0,1,2\)位置可以改变。

现有一数列\(C\)通过一种方式由\(A\)和\(B\)数列组成,数列\(C\)的第\(i\)位都有这样的规则:如果\(A_i>B_i\),\(C_i=A_i*B_i\);如果\(A_i=B_i\),\(C_i=0\);如果\(A_i<B_i\),\(C_i=-A_i*B_i\)。问当\(A,B\)数列如何组成时,\(C\)中的元素和最大。

思路:

\(1.\)要想让\(C_i\)最大,就要让\(A_i>B_i>0\),所以\(A_i\)只能为\(2\),\(B_i\)只能为\(1\)。

\(2.\)然后就要尽可能的不让剩下的影响到答案的大小,所以尽可能为\(0\),最后的就是无奈减去的。

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,x_1,y_1,z_1,x_2,y_2,z_2,ans;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>x_1>>y_1>>z_1;//A
		cin>>x_2>>y_2>>z_2;//B
		ans=0;//每次清零
		if(z_1>y_2){//如果A中2的个数比B中1的个数多,也就是剩下的是B中的1
			ans+=y_2*2;//每一次配对成功就加二
			z_1-=y_2;
			y_2=0;
		}else{//如果A中2的个数比B中1的个数少,也就是剩下的是A中的2
			ans+=z_1*2;
			y_2-=z_1;
			z_1=0;
		}
		if(z_2>x_1){//如果A中0的个数比B中2的个数少,也就是剩下的是B中的2
			z_2-=x_1;
			x_1=0;
		}else{//如果A中0的个数比B中2的个数多,也就是剩下的是A中的0
			x_1-=z_2;
			z_2=0;
		}
		if(z_2>z_1){//如果A中2的个数比B中2的个数少,那么剩下的二就只能配对成小于零的了
			z_2-=z_1;
			z_1=0;
		}else{//如果A中2的个数比B中2的个数少,那么剩下的可以和B中的0相消,不影响ans
			z_1-=z_2;
			z_2=0;
		}cout<<ans-z_2*2<<endl;//输出答案(减去配对A中的1,B中的2的)
	}
	return 0;
}

标签:数列,Sequence,int,个数,else,剩下,Ternary,ans,刷题
来源: https://www.cnblogs.com/Daidly/p/13583679.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有