睿智题目求调(有偿)
  • 板块灌水区
  • 楼主_wangleting123_
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/5/7 20:49
  • 上次更新2024/5/8 00:10:19
查看原帖
睿智题目求调(有偿)
1040559
_wangleting123_楼主2024/5/7 20:49
在一个给定的序列中,寻找一个最长的子序列(不要求连续),使得该子序列的和是3的倍数。
输入描述:

第一行n,表示共有n个数。

第二行共n个数,用一个空格隔开。
输出描述:

输出就一个整数,所求子序列的最大长度。
样例输入:

6 
1 2 2 1 2 5 

样例输出:

5
样例说明:

存在子序列1 2 2 2 5符合条件
数据规模:

对于20%的数据,n<=10

对于60%的数据,n<=1000

对于100%的数据,n<=100000,序列中的数<=100000。
#include<bits/stdc++.h>
using namespace std;
int ton1[4],ton2[4];
int a[1000010],n,sum;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		a[i]%=3;
		sum+=a[i];
		ton1[a[i]]++;
		ton2[a[i]]++;
	}
	long long ans1=n;
	ans1-=ton1[0];
	cout<<ton1[1]<<endl<<ton1[2]<<endl<<ton1[3]<<endl<<endl;
	//cout<<floor(ton[1]/3)*3+floor(ton[2]/3)*3<<endl;
	ans1-=(min(ton1[1],ton1[2])*2);
	cout<<ans1<<endl<<endl;
	//cout<<ans<<endl;
	ton1[1]-=min(ton1[1],ton1[2]);
	ton1[2]-=min(ton1[1],ton1[2]);
	ans1=ans1-floor(ton1[1]/3)*3;
	cout<<ans1<<endl<<endl<<floor(ton1[1]/3)*3<<endl<<endl;
	ton1[1]=ton1[1]-(ton1[1]/3*3);
	cout<<ton1[2]<<endl<<endl;
	ans1=ans1-floor(ton1[2]/3)*3;
	cout<<floor(ton1[2]/3)*3<<endl<<endl<<ans1<<endl<<endl;
	ton1[2]=ton1[2]-(ton1[2]/3*3);
	cout<<ans1<<endl<<endl;
	
	/*                          part2                               */
	
	long long ans2=n;
	ans2-=ton2[0];
	ans2=ans2-ton2[1]/3*3;
	ton2[1]=ton2[1]-(ton2[1]/3*3);
	ans2=ans2-ton2[2]/3*3;
	ton2[2]=ton2[2]-(ton2[2]/3*3);
	ans2-=(min(ton2[1],ton2[2])*2);
	//cout<<ans<<endl;
	ton2[1]-=min(ton2[1],ton2[2]);
	ton2[2]-=min(ton2[1],ton2[2]);
	cout<<ans2<<endl<<endl;
	cout<<max(n-ans1,n-ans2);
}
2024/5/7 20:49
加载中...