刷题记录 【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