Educational Codeforces Round 102 (Rated for Div. 2)

A. Replacing Elements

题意:给你一个长度为n的数组和要求数组里最大的数k,你可以通过操作a[i]+a[j]=a[k]改变数组里每个数的值,问能不能通过操作是的数组满足所有元素都小于k。
思路:模拟,如果最小的两个数的和小于k即可,注意还有一种是像 4 2 ,2 2 2 2 这种,要特判,如果最大的元素也小于k,则一定满足.

 #include <bits/stdc++.h>
using namespace std;
int a[1000];
int main()
{
	int i,j,n,t,k;
	cin>>t;
	while(t--){
		cin>>n>>k;
		for(i=0;i<n;i++){
			cin>>a[i];
		}
		sort(a,a+n);
		if(a[n-1]<=k||(a[0]+a[1])<=k){
			cout<<"YES"<<endl;
		}
		else 
			cout<<"NO"<<endl;
	}
}

B. String LCM

题意:给你两个字符串a,b,求是否存在这两个字符串的LCM串。
思路:通过他们的长度去求lcm,然后再通过lcm/长度,求得放大的倍数,放大完之后再比较是否相等即可。

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,i,j,t;
	cin>>t;
	string s1,s2;
	while(t--){
		cin>>s1>>s2;
		int d1=s1.length();
		int d2=s2.length();
		int ans;
		ans=(d1*d2)/(__gcd(d1,d2));
		int m1,m2;
		m1=ans/d1,m2=ans/d2;
		string sa,sb;
		for(i=0;i<m1;i++)
			sa+=s1;
		for(i=0;i<m2;i++)
			sb+=s2;
		if(sb==sa)
			cout<<sa<<endl;
		else 
			cout<<-1<<endl;
	}
}

C. No More Inversions

题意:给你一个数组 a:1,2,3,…,k−1,k,k−1,k−2,…,k−(n−k) (k≤n<2k).要找一个 p 排列p的长度为k,然后根据数组a和p生成数组b, 要求是,b数组中的逆序对数量不大于a数组中的逆序对数量,且字典序最大。
思路:蛮难理解的,当时是找规律思路有点混乱,数组a,他是递增到k再递减n-k个数,为了使数组b尽可能的大,应该想法是把大数往前,但是要考虑逆序对的数量。
列如如果是

a:1 2 3 4 3
则最大的b应该是 b: 1 2 4 3 4
所以 p: 1 2 4 3

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,i,j,k,t;
	cin>>t;
	while(t--){
		int n,k;
		cin>>n>>k;
		if(k==1){
			cout<<1<<endl;
			continue;
		}
		if(n==k){
			for(i=1;i<=k-1;i++)
				cout<<i<<" ";
			cout<<k<<endl;
			continue;
		}
		else {
			for(i=1;i<=k-(n-k)-1;i++)
				cout<<i<<" ";
			for(i=k;i>=k-(n-k)+1;i--)
				cout<<i<<" ";
			cout<<i<<endl;
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值