牛客周賽Ronud 46

du463發表於2024-06-11

比賽連結

A 樂奈吃冰

思路:

我感覺這題才是最難的,可惡,wa了好幾次,型號是OI賽制
模擬,假設有x份冰,y份熱,我們能吃min(x/2,y)份熱,但我們可以吃完所有點冰

Code:

#include<bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int> 
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)

void solve(){
	int a,b;
	cin>>a>>b;
	int x=min(a/2,b);
	if(x==0){
		cout<<a<<endl;
		return ;
	}
	else{
		cout<<x+a<<endl;
		return ;
		
	}
}

signed main(){
	int t=1;
	while(t--) solve();

	return 0;

}

B 素世喝茶

思路:

根據題意模擬一下,我寫的很複雜,肯定時候更簡單的思路

Code:

#include<bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int> 
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)

void solve(){
	int n,x;
	cin>>n>>x;
	std::vector<int> a(n+1);
	set<int> s;
	int maxn=-1;

	std::map<int, std::vector<int>> mp;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mp[a[i]].push_back(i);
		maxn=max(maxn,a[i]);
		// s.insert(a[i]);
	}
	int z=a[x];
	// cout<<z<<endl;
	
	sort(all(a));

	if(maxn==z){
		// cout<<1<<endl;
		
		if(mp[z].size()>1){
			// cout<<1<<endl;
			
			cout<<mp[z].size()-1<<endl;
			return ;
		}
		else{
			for(int i=n;i>=1;i--){
				if(a[i]!=maxn){
					// cout<<a[i]<<" ";
					
					cout<<mp[a[i]].size()<<endl;
					return ;
				}
			}
		}
	}
	else{
		cout<<mp[a[n]].size()<<endl;
		return ;
		
	}


	

}

signed main(){
	int t=1;
	while(t--) solve();

	return 0;

}

C 愛音開燈

思路:

我們找因子就可以了,但是需要注意n比x大和比x小的兩種情況

Code:

#include<bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int> 
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)



void solve(){
	int n,x;
	cin>>n>>x;

	int ans=0;

	for(int i=1;i<=sqrt(x);i++){
		if(i>n){
			break;
			
		}
		if(x%i==0){
			ans++;
			if(i!=(x/i)&&x/i<=n){
				ans++;
			}
		}
	}
	if(ans%2){
		cout<<"ON"<<endl;
		return ;
	}
	else{
		cout<<"OFF"<<endl;
		return ;
		
	}
}


signed main(){
	int t=1;
	while(t--) solve();

	return 0;

}

D 小登做題

思路:

根據mex函式,我們可以自然而然地發現mex函式最後得到的只能是0,1,2這三個數的其中一個

Code

#include<bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int> 
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)

void solve(){
	int a,b,c,k;
	cin>>a>>b>>c>>k;
	if(k!=0&&k!=1&&k!=2&&k!=a&&k!=b&&k!=c){
		cout<<-1<<endl;
		return ;
	}
	if(k==a||k==b||k==c){
		cout<<0<<endl;
		return ;
	}
	bool ok1=false;
	bool ok2=false;
	bool ok0=false;
	if(a==0||b==0||c==0){
		ok0=true;
	}
	if(a==1||b==1||c==1){
		ok1=true;
	}
	if(a==2||b==2||c==2){
		ok2=true;
	}
	int ans=0;
	if(!ok0){
		ans++;
		if(k==0){
			cout<<ans<<endl;
			return ;
		}
	}
	if(!ok1){
		ans++;
		if(k==1){
			cout<<ans<<endl;
			return ;
		}
	}
	if(!ok2){
		ans++;
		if(k==2){
			cout<<ans<<endl;
			return ;
			
		}
	}
	cout<<ans<<endl;
	return ;
	
	
	
}

signed main(){
	int t=1;
	cin>>t;

	while(t--) solve();

	return 0;

}

E 立希喂貓

思路:

二分+字首和

Code:

#include<bits/stdc++.h>

using namespace std;

#define int long long
#define all(x) x.begin()+1,x.end()
#define PII pair<int,int> 
#define IOS std::ios::sync_with_stdio(0),cin.tie(0)
const int N=1e5+10;
int a[N],b[N],idx[N];
int s[N];
int s1[N];

int n;

bool check(int x,int y){
	if(b[idx[x]]>y){
		return false;
	}
	else{
		return true;

	}
}


void solve(){
	// int n;
	cin>>n;
	
	// std::vector<int> a(n+1),b(n+1),idx(n+1);
	// std::vector<int> s(n+1);

	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int maxn=-1;


	for(int i=1;i<=n;i++){
		cin>>b[i];
		maxn=max(maxn,b[i]);
	}
	// int maxn=-1;

	for(int i=1;i<=n;i++){
		idx[i]=i;
		
	}

	sort(idx+1,idx+n+1,[&](int i,int j){
		return b[i]<b[j];
	});
	for(int i=1;i<=n;i++){
		s[i]=s[i-1]+b[idx[i]]*a[idx[i]];
		s1[i]=s1[i-1]+a[idx[i]];
	};
	// for(int i=1;i<=n;i++){
	// 	cout<<s[i]<<" "<<s1[i]<<endl;
		
	// }
	int q;
	cin>>q;
	
	while(q--){
		int x;
		cin>>x;
		// int ans=0;
		if(x>=maxn){
			cout<<s[n]<<endl;
			continue;
		}
		int l=0;
		int r=n+1;
		while(l<r){
			int mid=(l+r+1)/2;
			// cout<<mid<<endl;
			
			if(check(mid,x)){
				// cout<<1<<endl;

				l=mid;
			}
			else{
				// cout<<2<<endl;
				
				r=mid-1;

			}
		}
		// cout<<l<<
		cout<<s[l]+(s1[n]-s1[l])*x<<endl;
		// return ;
		

	}
	return ;
}

signed main(){
	int t=1;
	// cin>>t;

	while(t--) solve();

	return 0;

}

F 祥子拆團

思路:

質因數分解+Lucas定理+插板法(組合數)
一開始我的Lucas定理寫超時了,不知道哪裡出了一些問題(後續檢視)

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define M 1000000007

int i,j,k,n,m,t;

ll ksm(ll a,ll p){ll res=1;while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;}
ll c(ll n,ll m){
    if(m==0)return 1;
	ll r1=1,r2=1;
	for(int i=1;i<=m;i++)r1=r1*(n+1-i)%M,r2=r2*i%M;
	return r1*ksm(r2,M-2)%M;
}

int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>m; ll res=1;
		for(i=2;i<=40000;i++){
			k=0; while(!(n%i)){n/=i; k++;}
			res=res*c(m+k-1,k)%M;
		}
		if(n>1)res=res*m%M;
		cout<<res<<'\n';
	}
}