练习赛10(A、B、C、D)

传送门

A - Last Card

签到题,可以列出来公式 因为数据范围不大 也可以直接循环

#include<bits/stdc++.h>

using namespace std;

int main(){
	int n,k,x;
	cin>>n>>k>>x;
	x=(x+k-1)%n;
	if(x==0) x=n;
	cout<<x;
} 

B - KEYENCE building

直接预处理出来所有可能的面积 在进行判断

#include<bits/stdc++.h>

using namespace std;

int st[1010];

int main(){
	int n,k,x;
	for(int i=1;i<=1000;i++)
	for(int j=1;4*i*j+i*3+3*j<=1000;j++)
	st[4*i*j+i*3+3*j]=1;

	cin>>n;
	int cnt=0;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		cnt+=st[x];
	}
	cout<<n-cnt;
} 

C - ABC conjecture

题意:给定一个正整数n,求ijk<=n(1<=i<=j<=k<=n)的数量
题解:因为i<=j<=k,可以直接两成循环枚举 i 和 j 当i和j确定时 满足要求的 k 的数量就等于 n/(i*j)-j+1 (因为 k>=j ,所以要 -j+1 );

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

int main(){
	ll n;
	cin>>n;
	ll cnt=0;
	for(ll i=1;i*i*i<=n;i++){
		for(ll j=i;j*j*i<=n;j++)
		cnt+=n/(i*j)-j+1;
	}
	cout<<cnt;
} 

D - Project Planning

题意:有n个部门,每个部门有a[i]个人,每个项目都要由不同的部门的人共同完成,问最多可以完成多少个项目;
题解:可以直接二分项目的数量,来check是否成立 假设当前有mid个项目 每个部门有用的人最多是mid个(这个部门最多选出来mid个来参与mid个项目),注意这里可能会爆longlong,中间可以使用__int128来避免

#include<bits/stdc++.h>

using namespace std;

const int N=1000010;

typedef long long ll;

ll a[1000005];
ll n,k;
bool check(ll mid){
	ll sum=0;
	for(int i=1;i<=n;i++) sum+=min(a[i],mid);
	return sum>=(__int128)mid*k; 
}

void Test(){
	
	cin>>n>>k;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	ll l=0,r=1e18;
	while(l<r){
		ll mid=l+r+1>>1;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l;
}

int main(){
	ios::sync_with_stdio(false);
	
	int t;
//	cin>>t;
//	while(t--)
	Test();
} 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值