abc249_a
题目翻译
两个人走路,一个 $a$ 秒走 $b$ 米,休息 $c$ 秒,一个 $d$ 秒走 $e$ 米,休息 $f$ 秒。问 $x$ 秒后,谁走得多。
题目思路
小学数学题。$a+c$ 为一循环,$d+f$ 为一循环。之后再处理剩余秒数。
AC 代码
void solve()
{
int a,b,c,d,e,f,x;
cin>>a>>b>>c>>d>>e>>f>>x;
int asec=x%(a+c),arnd=x/(a+c),ameter;
ameter=(arnd*a+min(a,asec))*b;
int bsec=x%(d+f),brnd=x/(d+f),bmeter;
bmeter=(brnd*d+min(d,bsec))*e;
if(bmeter==ameter)puts("Draw");
else if(bmeter>ameter)puts("Aoki");
else puts("Takahashi");
}
abc249_b
题目翻译
有一个字符串,如果它既出现了小写字母,也出现了大写字母,并且所有字母均不同,那么输出 Yes
,否则输出 No
。
题目思路
按题意模拟即可。
AC 代码
void solve()
{
string s;
bool low=0,upp=0,same=0;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='A'&&s[i]<='Z')upp=1;
if(s[i]>='a'&&s[i]<='z')low=1;
for(int j=0;j<i;j++)
if(s[i]==s[j])
same=1;
}
puts(same==0&&upp==1&&low==1?"Yes":"No");
}
abc249_c
题目翻译
$n$ 个字符串,随意选几个字符串,问选出的字符串中,恰好出现 $k$ 次的字母有多少。
题目思路
枚举每个字符串的可能,为选和不选,之后对选了的进行判断。
肯定不超时,最高只有 $2^{15}\times 26=851968$。
AC 代码
string s[20];
bool f[20];
int a[30];
int ans;
void dfs(int n,int dep,int k)
{
if(dep==n)
{
for(int kk=0;kk<=1;kk++)
{
memset(a,0,sizeof(a));
if(kk==0)f[n]=0;
else f[n]=1;
int sum=0;
for(int i=1;i<=n;i++)
{
if(f[i]==1)
{
for(int j=0;j<s[i].size();j++)
{
a[s[i][j]-'a'+1]++;
}
}
}
for(int i=1;i<=26;i++)
{
if(a[i]==k)
{
sum++;
}
}
ans=max(ans,sum);
}
}
else
{
f[dep]=1;
dfs(n,dep+1,k);
f[dep]=0;
dfs(n,dep+1,k);
}
}
void solve()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
dfs(n,1,k);
cout<<ans<<endl;
}
abc249_d
题目翻译
输入 $n$ 个数字,选出三元组 $(i,j,k)$ 且 $\frac{a_i}{a_j}=a_k$。
题目思路
找出每个数字出现次数,枚举 $a_i$ 和 $a_k$。
AC 代码
int b[200005];
void solve()
{
int n,maxx=-1,minn=200005;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
maxx=max(maxx,x);
b[x]++;
}
long long ans=0;
for(int i=1;i<=maxx;i++)
{
for(int j=i;j<=maxx;j+=i)
{
ans+=1LL*b[i]*b[j/i]*b[j];
}
}
cout<<ans<<endl;
}