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();
}