全部评论 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-155
    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

热门讨论