A:
暴力,首先考录n/2,然后考虑2n/3,最后考虑4n/5.当n==1时跳出循环。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll q,a[10000+10],b[5]={2,3,5};
cin>>q;
for(int i=1;i<=q;i++)
{
cin>>a[i];
ll tot=0,flag=0;
for(int j=0;j<3;j++)
{
if(a[i]==1)break;
if(a[i]%b[j]==0&&j==0)a[i]/=2,j=-1,++tot;
else if(a[i]%b[j]==0&&j==1)a[i]=(a[i]/b[j])*2,j=-1,++tot;
else if(a[i]%b[j]==0&&j==2)a[i]=(a[i]/b[j])*4,j=-1,++tot;
}
if(a[i]==1)cout<<tot<<'\n';
else cout<<-1<<'\n';
}
return 0;
}
B:
定义三个变量,t, t1, t2,如果这个数列中的a[ i ] % 3==0,t++,如果这个数列里的a[ i ]%3==1, t1++,如果模3等于2,t2++;
令max等于t1,t2中的最大值,min等于最小值,然后答案就是t+min+(max-min)/3;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll t;;
cin>>t;
while(t--)
{
int n,ans=0,a[100+10];
memset(a,0,sizeof(a));
cin>>n;
int t1=0,t2=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]%3==0)++ans;
else if(a[i]%3==1)++t1;
else if(a[i]%3==2)++t2;
}
if(t1>t2)ans=ans+t2+(t1-t2)/3;
else ans=ans+t1+(t2-t1)/3;
cout<<ans<<'\n';
}
return 0;
}
C:
假设1234,给我们的数列时由1234排列组成的,那么我就遍历一遍数组,记录下1,2,3,4分别的个数,注意这个记录不是单纯的记录,要当这个数前面的数的个数大于他的个数的时候才记录。假设sum1(代表数列中1的个数)=2,而sum2(代表数列中2的个数)=2,那么如果在遍历到2,则不能sum2++,因为这样的2是不合法的。最后我们求出sum数组的最小值,答案就是n-min*6。
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int a[maxn],aa[7];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==4)++aa[0];
else if(a[i]==8&&aa[0]>aa[1])++aa[1];
else if(a[i]==15&&aa[1]>aa[2])++aa[2];
else if(a[i]==16&&aa[2]>aa[3])++aa[3];
else if(a[i]==23&&aa[3]>aa[4])++aa[4];
else if(a[i]==42&&aa[4]>aa[5])++aa[5];
}
int min=aa[0];
for(int i=0;i<=5;i++)
{
if(aa[i]<min)min=aa[i];
}
cout<<n-min*6<<'\n';
}
D:
思路:首先对于B数组,我们先从大到小处理这个数组里面的合数,就是非素数,这样做的目的是,如果一个合数,他的最大因数可能会是素数,例如:2 4 7 14。7与4匹配的话那么2和14不能匹配。所以先从大到小处理所有的合数,然后再来处理素数,用到的算法就是欧拉筛。里面有一个标记数组,当 i 不是素数时 isprime[ i ]=1,当 i 是素数时,isprime[ i ]=0;
首先用欧拉筛筛出所有的素数,存放到pri数组中,然后对b数组排序,从大到小排序,然后处理和数,再去处理素数。
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e6+10;
int pri[maxn],tot;
int ispri[maxn]; //判断是否为素数,如果是,pri[i]=0,否则为1.
void primeall() //欧拉筛筛出1-maxn中的所有的素数。
{
for(int i=2;i<maxn;i++)
{
if(!ispri[i])pri[++tot]=i;
for(int j=1;j<=tot&&pri[j]*i<maxn;j++)
{
ispri[pri[j]*i]=1;
if(i%pri[j]==0)break;
}
}
}
int a[maxn],b[maxn],sum[maxn],ans[maxn],t=0;
int main()
{
primeall();
int n;
cin>>n;
for(int i=1;i<=2*n;i++)
{
cin>>b[i];
sum[b[i]]++; //用sum数组对b数组里面的每一个元素计数。
}
sort(b+1,b+1+2*n);
for(int i=2*n;i>=1;i--) //处理所有的合数
{
if(ispri[b[i]]&&sum[b[i]]>0)
{
sum[b[i]]--;
ans[++t]=b[i];
for(int j=2;j*j<=b[i];j++)
{
if(b[i]%j==0)
{
sum[b[i]/j]--;
break;
}
}
}
}
for(int i=1;i<maxn;i++) //处理所有的素数
{
while(sum[i])
{
ans[++t]=i;
sum[i]--;
sum[pri[i]]--;
}
}
for(int i=1;i<=t;i++)cout<<ans[i]<<' ';
cout<<'\n';
return 0;
}