链接
T1:
2种情况:
平均分
%后平均分
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int m,n,a[10010],ans,i;
bool cmp(int x,int y){
return x%i>y%i;
}
int main(){
freopen("berries.in","r",stdin);
freopen("berries.out","w",stdout);
cin>>n>>m;
int maxx=0;
for(int i=1;i<=n;i++){
cin>>a[i];
maxx=max(maxx,a[i]);
}
for(i=1;i<=maxx;i++){
int sum=0;
for(int j=1;j<=n;j++)sum+=a[j]/i;
if(sum<m/2)break;//无用功
if(sum>=m){
ans=max(ans,i*m/2);
continue;
}
sort(a+1,a+1+n,cmp);//%后排序
int zh=(sum-(m/2))*i;//先计算一开始的
for(int j=1;j<=n;j++){
if(j+sum>m)break;
zh+=a[j]%i;
}
ans=max(ans,zh);
}
cout<<ans;
return 0;
}
T2:
二分+判断
判断不能爆力,用/
#include<iostream>
#include<cstdio>
using namespace std;
long long m,n,k;
long long check(long long x){
long long g=0,d=k;
while(d!=0){
long long y=(n-g)/x;
if(y<=m){
g+=m*d;
d=0;
}
else{
long long dy=(n-g)/y-x+1;//-x是平均分
if(dy<=d){
g+=y*dy;
d-=dy;
}
else{
g+=d*y;
d=0;
}
}
}
return g;
}
int main(){
freopen("loan.in","r",stdin);
freopen("loan.out","w",stdout);
cin>>n>>k>>m;
long long l=1,r=1e12;
while(r-l>1){
long long mid=(l+r)/2;
if(check(mid)>=n)l=mid;
else r=mid;
}
cout<<l;
return 0;
}
T3:
并查集
如果可以走就并在一起
后面加优化
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int m,n,a[100010],f[100010];
struct node{
int x,y,z;
}b[1000100];
bool cmp(node x,node y){
return x.z>y.z;
}
int getf(int x){
if(f[x]==x)return x;
else return f[x]=getf(f[x]);
}
int main(){
freopen("wormsort.in","r",stdin);
freopen("wormsort.out","w",stdout);
cin>>n>>m;
int flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=i;
if(a[i]!=i){
flag=1;
}
}
if(flag==0){
cout<<-1;
return 0;
}
for(int i=1;i<=m;i++){
cin>>b[i].x>>b[i].y>>b[i].z;
}
sort(b+1,b+1+m,cmp);
int j=1;
for(int i=1;i<=m;i++){
int fx=getf(b[i].x);
int fy=getf(b[i].y);
if(fx!=fy){
f[fx]=f[fy];
}
int flag=0;
while(getf(j)==getf(a[j]))j++;
if(j>n){
cout<<b[i].z;
return 0;
}
}
return 0;
}