在一个给定的序列中,寻找一个最长的子序列(不要求连续),使得该子序列的和是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;
ans1-=(min(ton1[1],ton1[2])*2);
cout<<ans1<<endl<<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;
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);
ton2[1]-=min(ton2[1],ton2[2]);
ton2[2]-=min(ton2[1],ton2[2]);
cout<<ans2<<endl<<endl;
cout<<max(n-ans1,n-ans2);
}