Codeforces Round #643 (Div. 2)

比赛链接:https://codeforces.com/contest/1355

A. Sequence with Digits

题意

给你第一个数和k,根据题中所给公式求出第k个数的值

思路

直接暴力,但中间会出现最大最小字符相乘为0的情况,然后break掉就不会超时了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;
ll mi,mx,n,k;
void solve(ll a)
{
	mi=9,mx=0;
	while(a)
	{
		mi=min(mi,a%10);
		mx=max(mx,a%10);
		a/=10;	
	}	
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		for(int i=1;i<k;i++)
		{
			solve(n);
			n+=mi*mx;
			if(mi*mx==0) break;
		}
		cout<<n<<endl;
	}
	
	return 0;
 }
 

B. Young Explorers

题意

题中所给数组表示第i个人所在的组最少有\(e_i\)个人

思路

对数组中数的大小进行统计,然后分配

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll t,n,a[N],num[N];

int main()
{
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++) num[i]=0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			num[a[i]]++;
		} 
		ll ans=0,tmp=0;
		for(int i=1;i<=n;i++){
			ans+=(tmp+num[i])/i;
			tmp=(tmp+num[i])%i;
		}
		cout<<ans<<'\n';
	}
	
	return 0;
 }

C. Count Triangles

题意

三个数x,y,z的范围是A≤x≤B≤y≤C≤z≤D,求用该三条边最多可以构成三角形的个数

思路

x+y的取值范围在[A+B,B+C]中,但在这范围之间由于x,y取值的变化会存在某一个值重复出现的情况,所以还要考虑某一个数重复出现的次数,
然后在[C,D]范围内找到第三条边满足构成三角形的情况,然后相乘即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll t,a,b,c,d;
 
int main()
{
	cin>>a>>b>>c>>d;
	ll ans=0,num;
	ll l=d-c+1;
	for(ll i=a+b;i<=b+c;i++){
		if(i>a+b&&i<b+c){
			num=min(i-(a+b)+1,(b+c)-i+1);
			num=min(num,min(b-a+1,c-b+1));
		}
		else num=1; 
		ll tmp=i-c;
		tmp=max(0ll,tmp);
		tmp=min(tmp,l);
		ans+=(tmp*num);
	}
	cout<<ans<<'\n';
	
	return 0;
 }

D. Game With Array

题意

大小为n的数组和为s,问是否存在一个大小为n数组的子数组和为k

思路

观察可以发现s/n大于1就存在反之不存在,构建数组只要将前n-1项全赋值为1即可,然后k值取s/2就行,写完c时间不够了,没交上。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll n,s;

int main()
{
	cin>>n>>s;
	int num=s/n;
	if(num>1){
		puts("YES");
		ll tmp=s;
		for(int i=1;i<=n-1;i++){
			cout<<"1 ";
			s--;
		}
		cout<<s<<'\n';
		cout<<(tmp+1)/2<<'\n';
	}
	else puts("NO");
	
	return 0;
 }
posted @ 2020-05-16 23:09  voids5  阅读(181)  评论(2编辑  收藏  举报