牛客白月赛25【题解】

https://ac.nowcoder.com/acm/contest/5600#question

AOE还是单体?【贪心】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
LL a[N],n,x,sum;
map<int,int>mp;
vector< pair<int,int> >ve;
int main(void) 
{
    
    
	cin>>n>>x;
	for(int i=0;i<n;i++)
	{
    
    
		 cin>>a[i];
		 mp[a[i]]++;
		 sum+=a[i];
	}
	for(auto i=mp.begin();i!=mp.end();i++) 
		ve.push_back({
    
    i->first,i->second});
	LL index=-1;
	for(int i=0;i<ve.size();i++)
	{
    
    
		int cnt=ve.size()-i;//剩余人数
		if(cnt>x) index=i;
	}
	if(index==-1) cout<<sum;
	else
	{
    
    
		LL ans=ve[index].first*x;
		for(int i=index+1;i<ve.size();i++) 
            ans+=(ve[i].first-ve[index].first)*ve[i].second;
		cout<<ans;
	}
	return 0;
}

k-size字符串【组合数】

在这里插入图片描述

先鸽了。

白魔法师【并查集】

在这里插入图片描述
先将所有连通的黑的集合到一块,白的集合到一块。
然后枚举黑的点即可。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int h[N],e[N],ne[N],idx;
int p[N],siz[N],n; 
void add(int a,int b)
{
    
    
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int find(int x) 
{
    
    
	if(x!=p[x]) p[x]=find(p[x]);
	return p[x];
}
int main(void)
{
    
    
	memset(h,-1,sizeof h);
	cin>>n;
	string s; cin>>s;
	for(int i=1;i<=n;i++) p[i]=i,siz[i]=1;
	for(int i=1;i<=n-1;i++)
	{
    
    
		int a,b; cin>>a>>b;
		add(a,b),add(b,a);
		if(s[a-1]==s[b-1]&&find(a)!=find(b)) 
		{
    
    
			siz[find(a)]+=siz[find(b)];
			p[find(b)]=find(a);
		}
	}
	int ans=0;
	for(int i=0;i<s.size();i++)
	{
    
    
		if(s[i]=='W') ans=max(ans,siz[find(i+1)]);
		else
		{
    
    
			int sum=1;
			for(int j=h[i+1];j!=-1;j=ne[j])
			{
    
    
				int u=e[j];
				if(s[u-1]=='W') sum+=siz[find(u)];
			}
			ans=max(ans,sum);
		}
	}
	cout<<ans;
	return 0;
}

抽卡【容斥 概率】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
const int mod=1e9+7;
LL s1[N],s2[N],n,sum1,sum2,sum3;
LL qsm(LL a,LL b,LL p)
{
    
    
	LL sum=1;
	while(b)
	{
    
    
		if(b&1) sum=(sum*a)%p;
		b>>=1;
		a=(a*a)%p;
	}
	return sum%p;
}
int main(void)
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++) cin>>s1[i];
	for(int i=1;i<=n;i++) cin>>s2[i];
	sum1=1,sum2=1,sum3=1;
	for(int i=1;i<=n;i++)
	{
    
    
		sum1=(sum1*(s1[i]-s2[i]))%mod;
		sum2=sum2*qsm(s1[i],mod-2,mod)%mod;
		sum3=(sum3*s1[i]%mod);
	}
	LL sum=(sum3-sum1+mod)%mod;
	sum=(sum*sum2)%mod;
	cout<<sum;
	return 0;
}

点击消除【模拟】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
deque<char>q;
int main(void)
{
    
    
	string s; cin>>s;
	for(int i=0;i<s.size();i++)
	{
    
    
		q.push_back(s[i]);
		while(q.size()>=2)
		{
    
    
			auto a=q.back(); q.pop_back();
			auto b=q.back(); q.pop_back();
			if(a==b) continue;
			else 
			{
    
    
				q.push_back(b);
				q.push_back(a);
				break;
			}
		}
	}
	if(q.size()==0) cout<<0;
	while(q.size()) cout<<q.front(),q.pop_front();
	return 0;
}

疯狂的自我检索者【简单贪心】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int a[N],sum,sum1,sum2;
int main(void)
{
    
    
	int n,m; cin>>n>>m;
	for(int i=1;i<=n-m;i++) cin>>a[i],sum+=a[i];
	for(int i=n-m+1;i<=n;i++) sum1+=1,sum2+=5;
	printf("%.5lf %.5lf\n",(sum+sum1)*1.0/n,(sum+sum2)*1.0/n);
	return 0;
}

解方程【二分】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main(void)
{
    
    
	cin>>a>>b>>c;
	double l=0,r=1e9;
	for(int i=0;i<=1e6*5;i++)
	{
    
    
		double mid=(l+r)/2;
        double now = pow(mid,a)+b*log(mid);
        if(now<c) l = mid;
        else r = mid;
	}
	printf("%.7lf",l);
	return 0;
}

神奇的字母(二)【模拟】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int a[35]={
    
    0};
string s;
int main(void)
{
    
    
	while(getline(cin,s))
	{
    
    
		for(int i=0;i<s.size();i++)
			if(s[i]>='a'&&s[i]<='z') a[s[i]-'a']++;
	}
	int maxv=0,cnt=0;
	for(int i=0;i<26;i++) if(a[i]>maxv) maxv=a[i],cnt=i;
	printf("%c",cnt+'a');
	return 0;
}

十字爆破

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL a[N],b[N],n,m;
int main(void) 
{
    
    
	int n,m; cin>>n>>m;
	vector< vector<int> > ve(n+1,vector<int>(m+1,0));
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
			scanf("%d",&ve[i][j]);
			a[i]+=ve[i][j],b[j]+=ve[i][j]; 
		}
	}
	for(int i=1;i<=n;i++)
	{
    
    
		for(int j=1;j<=m;j++)
		{
    
    
            printf("%lld ",a[i]+b[j]-ve[i][j]);
		}
		puts("");
	}
	return 0;
}

异或和之和【思维 位运算】

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h> 
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
const int mod=1e9+7;
LL a[N],s[65],n,sum;
LL qsm(LL a,LL b,LL p)
{
    
    
	LL sum=1;
	while(b)
	{
    
    
		if(b&1) sum=sum*a%p;
		b>>=1;
		a=a*a%p;
	}
	return sum%p;
}
LL solve(LL a,LL b)
{
    
    
	LL sum=1;
	for(int i=a,j=1;j<=b;j++,i--) sum=(sum*i)%mod;
	for(int i=b;i>=1;i--) sum=(sum*qsm(i,mod-2,mod))%mod;
	return sum;
}
int main(void)
{
    
    
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++)
		for(int j=0;j<64;j++)
			if(a[i]>>j&1) s[j]++;
	for(int i=0;i<64;i++)
	{
    
    
		LL temp=(1ll<<i)%mod*(solve(s[i],3)%mod+solve(n-s[i],2)%mod*s[i]%mod)%mod;
		sum=(sum+temp)%mod;
	} 
	cout<<sum;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/124601493