比赛链接: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<<'
';
}
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<<'
';
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<<'
';
cout<<(tmp+1)/2<<'
';
}
else puts("NO");
return 0;
}