A
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
int main()
{
int x,y,z;// ��
int a,b,c;// ӵ��
cin>>x>>y>>z;
cin>>a>>b>>c;
int ans=a+b;
if(x+y+z>a+b+c)
{
cout<<"NO"<<endl;
return 0;
}
else
{
if(x>a)
{
cout<<"NO"<<endl;
return 0;
}
else
{
ans=ans-x;
if(y>ans)
{
cout<<"NO"<<endl;
return 0;
}
else
{
cout<<"YES"<<endl;
return 0;
}
}
}
}
B
思路:排一下序 把前m*k个取出来 然后遍历查找 最后注意区间是k个区间,输出k-1个数
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[200010];
int b[200010];
int cmp(int x,int y)
{
return x>y;
}
map<int,int>mpp;
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i];
}
sort(a,a+n,cmp);
ll ans=0;
for(int i=0;i<m*k;i++)
{
int x=a[i];
ans+=x;
mpp[x]++;
}
cout<<ans<<endl;
int x=0;
ll summ=k-1;
for(int i=0;i<n;i++)
{
if(!mpp[b[i]])
continue;
if(mpp[b[i]])
{
mpp[b[i]]--;
x++;
//cout<<mpp[b[i]]<<"b[i]"<<endl;
}
if(x==m&&summ)
{
summ--;
x=0;
cout<<i+1<<" ";
}
}
return 0;
}
C
参考 https://blog.csdn.net/Wen_Yongqi/article/details/86976902
题意:求n!在b进制下末尾0的个数
思路:等价于n!%(b^k)==0的最大k
将b分解为若干素数乘积,记录每个素数含多少次方 b = p1^y1·p2^y2·...·pm^ym.
然后求n!种每个素数含多少次方n ! = p1^x1·p2^x2·...·pm^xm·
答案就是
求N!二进制中有多少个p 就像就N!中含有5个数一样,n/5,n/5/5.。。。。(之前新生赛做过这样的题)
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
#include<set>
#include<map>
#define ll long long
using namespace std;
ll calc(ll p,ll n)// 求N!二进制中有多少个P
{
ll ans=0;
while(n)
{
ans+=n/p;
n/=p;
}
return ans;
}
int main()
{
ll n,m;
cin>>n>>m;
ll minn=1e18+10;
for(ll i=2;i*i<=m;i++)
{
if(!(m%i))
{
ll cnt=0;
while(!(m%i))
{
m/=i;
cnt++;
}
minn=min(minn,calc(i,n)/cnt);
}
}
if(m>1)
{
minn=min(minn,calu(m,n));
}
cout<<minn<<endl;
return 0;
}