CF1875

A Jellyfish and Undertale

这个直接顺着选就好了,能过

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=105;
int x[maxn];
int t;		
int a,b,n;
signed main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		memset(x,0,sizeof(x));
		cin>>a>>b>>n;
		for(int i=1;i<=n;i++) cin>>x[i];
		int tim=b;
		for(int i=1;i<=n;i++){
			if(1+x[i]<=a) tim+=x[i];
			else tim+=(a-1);
		}
		cout<<tim;
		cout.put('\n');
	}
	return 0;
}

B Jellyfish and Game

U1S1我打的时候是div2B啊,咋变A了,不懂,不管给他当1875B了(1874B题解都看不懂...)
分类讨论一下最大值最小值就可以显然的得出二者的选择策略,然后就应该很好处理了

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
int n,m;
const int maxn=55;
int a[maxn];
int b[maxn];
int minn=INT_MAX,minna=INT_MAX,minnb=INT_MAX,maxx,maxxa,maxxb;
signed main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		int n,m,k;
		cin>>n>>m>>k;
		minn=INT_MAX,minna=INT_MAX,minnb=INT_MAX,maxx=0,maxxa=0,maxxb=0;
		int sum1=0,sum2=0;
		int maxid=0,minid=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			sum1+=a[i];
			if(a[i]>maxx){
				maxid=1;
				maxx=a[i];
			}
			maxxa=max(a[i],maxxa);
			minna=min(a[i],minna);
			if(a[i]<minn){
				minid=1;
				minn=a[i];
			}
		}
		for(int i=1;i<=m;i++){
			cin>>b[i];
			if(b[i]>maxx){
				maxid=2;
				maxx=b[i];
			}
			maxxb=max(b[i],maxxb);
			minnb=min(b[i],minnb);
			if(b[i]<minn){
				minid=2;
				minn=b[i];
			}
		}
		if(maxxb<minna){
			if(k%2==1) cout<<sum1<<'\n';
			else cout<<sum1+minnb-maxxa<<'\n';
		}
		else if(maxid==1&&minid==1){
			if(k%2==1) cout<<maxxb-minn+sum1<<'\n';
			else cout<<maxxb-maxx+sum1<<'\n';
		}
		else if(maxid==1&&minid==2){
			if(k%2==1) cout<<sum1+maxxb-minna<<'\n';
			else cout<<sum1+maxxb-minna-maxx+minn<<'\n';
		}
		else if(maxid==2&&minid==1){
			if(k%2==1) cout<<sum1+maxx-minn<<'\n';
			else cout<<sum1<<'\n';
		}
		else{
			if(k%2==1) cout<<sum1+maxx-minna<<'\n';
			else cout<<sum1+minn-minna<<'\n';
		}
	}
	return 0;
}

C Jellyfish and Green Apple

很显然可以想到,每个人分到的苹果要么是整数要么是 x1<<y 的模式所以无解应该很好判断,然后我们在考虑如何计算答案,由于已经知道有多少个苹果了所以只要苹果能分的话我们就分给每个人,否则的话我们就给所有苹果切一刀,然后再分,证明一下,这其实就相当于给分数形式分子分母都放大了,如果每个人都收到了等量的 1(1<<y) 这样就保证了正确性,最优的话因为每个人都收到一样的份数,所以当你要切时必然不可能只切一部分否则就证明上回切少了对吧

#include<bits/stdc++.h>
using namespace std;
#define int long long
map<int,int>mp;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	for(int i=0;i<=30;i++) mp[1<<i]=1;
	int t;
	cin >>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		int nn=n,mm=m;
		int now=__gcd(n,m);
		if(!mp[m/now]){
			cout<<"-1"<<'\n';
			continue;
		}
		int ans=0;
		nn%=m;
		while(nn){
			ans+=nn;
			nn*=2;
			if(nn>=m) nn%=m;
		}
		cout<<ans<<'\n';
	}
	return 0;
}

D Jellyfish and Mex

不会,看题解才明白,我太菜了

考虑dp,因为你删到最后mex肯定是零,考虑f[i]表示,使mex值变为i时的代价,很显然就可以得出转移式f[i]=min(f[j]+(cnti1)j+i)

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
const int maxn=5005;
int f[maxn];
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		mp.clear();
		memset(f,0x3f,sizeof(f));
		for(int i=1;i<=n;i++){
			int x;
			cin>>x;
			mp[x]++;
		}
		int mx=0;
		while(mp[mx]) mx++;
		f[mx]=0;
		for(int i=mx;i>=1;i--){
			for(int j=i-1;j>=0;j--){
				f[j]=min(f[j],f[i]+(mp[j]-1)*i+j);
			}
		} 
		cout<<f[0]<<'\n';
	}
	return 0;
}

posted @   jt0007  阅读(475)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示