abc252_a
题目翻译
给一个数字 $n$,输出 ASCLL 码里第 $n$ 位的字母。
题目思路
直接输出。
AC 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<char(n)<<endl;
return 0;
}
abc252_b
题目翻译
有 $n$ 个数,$a_1,a_2,a_3...a_n$,选择 $k$ 个数,分别为 $b_1,b_2,b_3...b_k$。
问 $b$ 里是否有最大数。
题目思路
先找出 $a$ 的最大值,判断是否有最大即可。
AC 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k,maxx=-1;
bool f=0;
cin>>n>>k;
int a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
maxx=max(maxx,a[i]);
}
for(int i=1;i<=k;i++)
{
int x;
cin>>x;
if(a[x]==maxx)f=1;
}
puts(f?"Yes":"No");
return 0;
}
abc252_c
题目翻译
输入 $n$ 个 $0$ 到 $9$,$10$ 个数字构成的排列。
如果在第 $i$ 秒按下停止按钮,那么他会显示第 $i%10$ 个字符($0$秒最左的字符,$9$ 秒最右的字符)。
同一秒只能按下一个停止按钮。
目标是让这 $n$ 个排列显示相同的字母。
问最优情况下需要几秒。
题目思路
枚举最后出现哪个数字。
AC 代码
#include<bits/stdc++.h>
using namespace std;
string s[105];
int a[105][105];
int main()
{
int n,ans=INT_MAX;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<s[i].size();j++)//0开始,错了好几次QwQ
{
a[s[i][j]-'0'][i]=j;//每种字符的第i的字符串所在位置。
for(int k=1;k<i;k++)
{
if(a[s[i][j]-'0'][k]%10==j)
{
a[s[i][j]-'0'][i]+=10;//多10秒
}
}
}
}
for(int i=0;i<=9;i++)
{
int m=-1,cnt=0;
for(int j=1;j<=n;j++)
{
m=max(m,a[i][j]);
}
ans=min(ans,m);
}
cout<<ans<<endl;
return 0;
}
abc252_d
题目翻译
有 $n$ 个数,问是否存在 $a_i\ne a_j \ne a_k$ 且 $i<j<k$。
题目思路
容斥原理,看所有排列 $-$ 三个一样 $-$ 两个一样。
AC 代码
#include<bits/stdc++.h>
using namespace std;
long long s[200005];
int main()
{
long long n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[a[i]]++;
}
long long x=n*(n-1)/2*(n-2)/3;//总数
long long y=0,z=0;
for(int i=1;i<=200000;i++)//三个一样
{
long long yy=0;
if(s[i]>=3)
{
yy=s[i]*(s[i]-1)/2*(s[i]-2)/3;
}
y+=yy;
}
for(int i=1;i<=200000;i++)//两个一样
{
long long zz=0;
if(s[i]>=2)
{
zz=s[i]*(s[i]-1)/2*(n-s[i]);
}
z+=zz;
}
cout<<x-y-z<<endl;
return 0;
}
abc252_f
题目翻译
双倍经验。
题目思路
同上,不同在于,考虑有剩余的话,再请一个人来拿走剩余部分。
AC 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
multiset<long long>s;
long long n,l,ss=0;
cin>>n>>l;
for(int i=1;i<=n;i++)
{
long long x;
cin>>x;
s.insert(x);
ss+=x;
}
if(l-ss!=0)s.insert(l-ss);
long long sum=0;
while(s.size()>1)
{
long long x=*s.begin();
s.erase(s.begin());
long long y=*s.begin();
s.erase(s.begin());
s.insert(x+y);
sum+=x+y;
}
cout<<sum<<endl;
return 0;
}