(Training 6)Codeforces Round #694

A. Strange Partition

题意:给出大小为n一个数组a ,能进行多次操作 将ai+aj合并合并后数组减短 得到数组b 给出一个x 问最大是多少
思路:这里是用的向上取整 很好想如果全部合在一起那么最多是sum/x+1而如果全部拆开是那么可能是sum/x+n这里我们直接枚举即可 记得开longlong

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int main(){
    
    
	int T;
	scanf("%d",&T);
	while(T--){
    
    
		int n,k;
		scanf("%d%d",&n,&k);
		long long sum=0,ans1=0,ans2=0;
		for(int i=1;i<=n;i++){
    
    
			int x;
			scanf("%d",&x);
			ans1+=(x+k-1)/k;
			sum+=x;
		}
		printf("%lld %lld\n",(sum+k-1)/k,ans1);
	}
 
} 

B. Strange List

题意:您已将长度为n的数组a和整数x赋予了一个全新的机器人。机械手的操作如下:迭代数组的元素,让当前元素为q。如果q可被x整除,则机械手会将x个这样的整数q/x 添加到数组的末尾,然后移至下一个元素。请注意,新添加的元素可以稍后由机器人处理。否则,如果q不能被x整除,则机器人将关闭问这个关闭时所有的值加起来是多少
思路:总个数为1e5 我们直接从前往后枚举即可tot[]数组表示x的个数

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int a[N*25];
int tot[N*25];
int main(){
    
    
	int T;
	scanf("%d",&T);
	while(T--){
    
    
		int n,k;
		scanf("%d%d",&n,&k);
		long long sum=0,ans1=0,ans2=0,cnt=n;
		long long ans=0,flag=1;
		for(int i=1;i<=n;i++){
    
    
			int x;
			scanf("%d",&a[i]);
			tot[i]=1;
		}
			int i=1;
			while(i<=cnt){
    
    
				ans+=a[i]*tot[i];
				if(flag){
    
    
					if(a[i]%k){
    
    
						flag=0;
					}
					else{
    
    
						tot[++cnt]=tot[i]*k;
						a[cnt]=a[i]/k;
					}
				}
				i++;
			}
			cout<<ans<<endl;
	}
	return 0;
}

C. Strange Birthday Party

题意:n个朋友参加聚会 送他们礼物或者钱 礼物必须满足在这里插入图片描述

钱必须等于Ck
然后礼物的价格满足升序

思路:贪心排个序就好啦

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
typedef long long LL;
int a[N];
int c[N];
bool cmp(int x,int y){
    
    
	return x>y;
}
bool st[N];
int main(){
    
    
	int T;
	cin>>T;
	while(T--){
    
    
		int n,k;
		memset(st,0,sizeof st);
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++){
    
    
			scanf("%d",&a[i]);
		}
		sort(a+1,a+1+n,cmp);
		for(int i=1;i<=k;i++){
    
    
			scanf("%d",&c[i]);
		}
		LL ans=0;
		int cnt=1;
		for(int i=1;i<=n;i++){
    
    
			if(cnt<=k&&c[cnt]<=c[a[i]])
			ans+=c[cnt++];
			else ans+=c[a[i]];
		}
		cout<<ans<<endl;
	}
}

D. Strange Definition

题意:在这里插入图片描述
思路:x和y满足有关时他们相乘必然是一个完全平方数 我们进行质因数分解如果一个质因子p为偶数次方那么我们取p的0次方 (因为p的偶数次方为完全平方数我们把它约掉)如果为奇数次方那么我们取p的1次方
这时候在处理完后x和y如果他们能成为相关 那么这2个数一定相等 在w=0时ans就是相等的数的个数的最大值
在w>1时 如果相等的数总个数为偶数即为偶数个1相加为偶数 如果为奇数那么为奇数个奇数相加仍然为奇数 再进行多次操作后答案不会改变 所以ans只有2种情况 而奇数一直不变 所以在w>1的时候 ans取w=0时候的ans 与所有偶数个数的 的最大值

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e6+10; 
int primes[N],cnt,a[N];
 
bool st[N];
void init(){
    
    
	int n=N-1;
	for(int i=2;i<=n;i++){
    
    
		if(!st[i])primes[++cnt]=i;
		for(int j=1;primes[j]<=n/i;j++){
    
    
			st[primes[j]*i]=1;
			if(i%primes[j]==0)break;
			
		}
	}
}
int main(){
    
    
	int T;
	init();
	scanf("%d",&T);
	while(T--){
    
    
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
    
    
			scanf("%d",&a[i]);
			for(int j=1;primes[j]<=a[i]/primes[j];j++){
    
    
				if(a[i]%primes[j]==0){
    
    
					int cnt1=0;
					while(a[i]%primes[j]==0)a[i]/=primes[j],cnt1++;
					if(cnt1&1)a[i]*=primes[j];
				}
			}
 
		}
		sort(a+1,a+1+n);
		int ans1=0,ans2=0,pre=0;
		a[n+1]=0;
		for(int i=1;i<=n;i++){
    
    
			if(a[i]!=a[i+1]){
    
    
				ans1=max(ans1,i-pre);
				if(a[i]==1)ans2+=i-pre;
				else if(!(i-pre&1))ans2+=i-pre;//偶数个奇数相乘等于偶数
				pre=i; 
			}
		}
		int q;
		ans2=max(ans2,ans1);
		scanf("%d",&q);
		while(q--){
    
    
			LL w;
			scanf("%lld",&w);
			if(w==0)printf("%d\n",ans1);
			else printf("%d\n",ans2);
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_45663216/article/details/112689855
今日推荐