998244353
2024-10-20 15:14:38
发布于:广东
111
全部评论 5
顶
2天前 来自 广东
1#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const ll M=1e10+5;
ll l,r,mid,a[N],n,k,b[N],tmp,ans=M,need,cnt,sum,pos;
unordered_map<ll,int> mp;
struct node{
ll t=0,val;
}c[N];
bool cmp(const node A,const node B){
return A.t>B.t;
}
void add(ll x){
if(mp[x]) c[mp[x]].t++;
else{
mp[x]=cnt;
c[cnt].val=x;
c[cnt].t;
}
}
void check(ll mid){
sum=0;
for(int i=1;i<=n;i++){
b[i]=0;
tmp=a[i];
while(tmp>mid){
b[i];
tmp/=2;
}
if(tmp!=mid) b[i]=M;
}
sort(b+1,b+1+n);
for(int i=1;i<=k;i){
if(b[i]==M) return;
else sum+=b[i];
}
ans=min(ans,sum);
}
int main(){
// freopen("test9.in","r",stdin);
// freopen("D7T4.out","w",stdout);
scanf("%lld %lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
tmp=a[i];
add(tmp);
while(tmp){
tmp/=2;
add(tmp);
}
}
sort(c+1,c+1+cnt,cmp);
l=1,r=cnt;
while(l<=r){
mid=(l+r)>>1;
if(c[mid].t>=k){
pos=max(pos,mid);
l=mid+1;
}
else r=mid-1;
}
for(int i=1;i<=pos;i++) check(i);
printf("%lld",ans);
// fclose(stdin);
// fclose(stdout);
return 0;
}2天前 来自 广东
0//最后获得的k种石子的数量一定是2的次方 //枚举17种最后的数量, //1 2 4 8 //int a[200010]; //int ans=1e9; //for(int i=1;i<=2e5;i*=2){ // vector<int>ve; // for(int j=1;j<=n;j++){ // if(a[j]<i)continue; // int temp=a[j],cnt=0; // while(temp!=i)cnt++,temp/=2; // ve.push_back(cnt); // } // sort(ve.begin(),ve.end()); // if(ve.size()<k)continue; // int sum=0; // for(int j=0;j<k;j++){ // sum+=ve[j]; // } // ans=min(ans,sum); //} #include<bits/stdc++.h> using namespace std; //如果不是2的次方,那么就只有2e5种 int a[200010]; int ans=1e9; //2e5*50*17 int main(){ // freopen("D7T4.in","r",stdin); // freopen("D7T4.out","w",stdout); int n,k;cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=0;i<=2e5;i++){ vector<int>ve; for(int j=1;j<=n;j++){ if(a[j]<i)continue; int temp=a[j],cnt=0; while(temp>i)cnt++,temp/=2; if(temp==i)ve.push_back(cnt); } sort(ve.begin(),ve.end()); if(ve.size()<k)continue; int sum=0; for(int j=0;j<k;j++){ sum+=ve[j]; } ans=min(ans,sum); } cout<<ans<<endl; fclose(stdin); fclose(stdout); } //考虑换一种方向 //1 //1 (2-3) //2 (4-7) //3 (8-15) //k=3 8-15有5 int sum[200010]; for(int i=1;i<=a[i];i++)sum[a[i]]++; for(int i=1;i<=2e5;i++)sum[i]+=sum[i-1]; int ans=1e9; for(int p=0;p<=2e5;p++){//枚举最后k种石头变成多少 int temp=0; if(p>0)k-=sum[p]-sum[p-1]; for(int i=1;i<=18;i++){ int l=p*(1<<i),r=l+(1<<i)-1; int summ=sum[r]-sum[l-1]; if(summ>k){ temp+=k*i; k=0; } else { temp+=summ*i; k-=summ; } } ans=min(ans,temp); } //2 //1 (4-5) //2 (8-11) //3 (16-23) int ans[N];//ans[i]表示将k种石子变成i需要的最小操作次数 int cnt[N];//cnt[i]表示当前有多少种石子能够变成i sort(a+1,a+1+n); for(int i=1;i<=n;i++){ int bushu=0; int t=a[i]; while(t){ if(cnt[t]<k)ans[t]+=bushu; cnt[t]++; bushu++; t/=2; } } int res=1e9; for(int i=0;i<=2e5;i++){ if(cnt[i]>=k)res=min(res,ans[i]); }
2天前 来自 广东
0//最后获得的k种石子的数量一定是2的次方 //枚举17种最后的数量, //1 2 4 8 //int a[200010]; //int ans=1e9; //for(int i=1;i<=2e5;i*=2){ // vector<int>ve; // for(int j=1;j<=n;j++){ // if(a[j]<i)continue; // int temp=a[j],cnt=0; // while(temp!=i)cnt++,temp/=2; // ve.push_back(cnt); // } // sort(ve.begin(),ve.end()); // if(ve.size()<k)continue; // int sum=0; // for(int j=0;j<k;j++){ // sum+=ve[j]; // } // ans=min(ans,sum); //} #include<bits/stdc++.h> using namespace std; //如果不是2的次方,那么就只有2e5种 int a[200010]; int ans=1e9; //2e5*50*17 int main(){ // freopen("D7T4.in","r",stdin); // freopen("D7T4.out","w",stdout); int n,k;cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=0;i<=2e5;i++){ vector<int>ve; for(int j=1;j<=n;j++){ if(a[j]<i)continue; int temp=a[j],cnt=0; while(temp>i)cnt++,temp/=2; if(temp==i)ve.push_back(cnt); } sort(ve.begin(),ve.end()); if(ve.size()<k)continue; int sum=0; for(int j=0;j<k;j++){ sum+=ve[j]; } ans=min(ans,sum); } cout<<ans<<endl; fclose(stdin); fclose(stdout); }
2天前 来自 广东
0#include<bits/stdc++.h> using namespace std; //将字符转化为整数 //枚举所有可能的牌 //判断是否有牛 //计算点数 bool check(int a[]){ for(int i=0;i<5;i++){ for(int j=i+1;j<5;j++){ for(int k=j+1;k<5;k++){ if((a[i]+a[j]+a[k])%10==0)return 1; } } } return 0; } int sum(int a[]){ if(!check(a))return 0; return (a[0]+a[1]+a[2]+a[3]+a[4])%10?(a[0]+a[1]+a[2]+a[3]+a[4])%10:10; } int d[10],fq[10];//存点数 int get(char c){//把字符转化为点数 if(c>='0'&&c<='9')return c-'0'; return 10; } int cnt[13]; int main(){ for(int i=0;i<5;i++){ char c; cin>>c; fq[i]=get(c); cnt[fq[i]]++; } for(int i=0;i<4;i++){ char c; cin>>c; d[i]=get(c); cnt[d[i]]++; } int ans1=sum(fq),ans2=0; for(int i=1;i<=10;i++){ if(cnt[i]==4&&i!=10)continue; d[4]=i; ans2=max(ans2,sum(d)); } if(ans1<ans2)cout<<"Yes"; else cout<<"No"; cout<<ans2; return 0; }
2天前 来自 广东
0
有帮助,赞一个