Acwing第 27 场周赛【完结】

4079. 数字串【签到】

在这里插入图片描述
https://www.acwing.com/problem/content/4082/

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    
    
    string s;
    for(int i=1;i<=500;i++) s+=to_string(i);
    int t; cin>>t;
    while(t--)
    {
    
    
        int n; cin>>n;
        cout<<s[n-1]<<endl;
    }
    return 0;
}

4080. 第k个数【思维 / 二分】

在这里插入图片描述
https://www.acwing.com/problem/content/description/4083/

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL n,m,k;
bool check(LL mid)
{
    
    
    LL sum=0;
    for(int i=1;i<=n;i++) //枚举每一个行
    	sum+=min(m,mid/i);//计算每一行有几个数是小于等于mid的
    return sum>=k;//下于等于mid的个数大于等于k
}
int main(void)
{
    
    
    cin>>n>>m>>k;
    LL l=1,r=n*m;
    while(l<r)
    {
    
    
        LL mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
    return 0;
}

4081. 选数【费用背包】

在这里插入图片描述
https://www.acwing.com/problem/content/description/4084/

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=210,M=5010;
int n,m;
int v[N],w[N];
int f[N][M];//选n个数,5的数量为M 的情况下2的个数
int main(void)
{
    
    
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
    
    
		LL x; cin>>x;
		while(x%5==0) x/=5,v[i]++;
		while(x%2==0) x/=2,w[i]++;
	}
	memset(f,-0x3f,sizeof f);
	f[0][0]=0;
	for(int i=1;i<=n;i++)
		for(int j=m;j;j--)
			for(int k=i*25;k>=v[i];k--)
			{
    
    
				f[j][k]=max(f[j][k],f[j-1][k-v[i]]+w[i]);
			}
	int res=0;
	for(int i=1;i<M;i++) res=max(res,min(i,f[m][i]));
	cout<<res;
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_46527915/article/details/121590759