abc248_a

题目翻译

有一个字符串 $s$,找出 $0$ 到 $9$ 中没出现的数。

题目思路

直接开数组存出现次数。

AC 代码

int a[10];
void solve()
{
    string s;
    cin>>s;
    for(int i=0;i<9;i++)
    {
        a[s[i]-'0']++;
    }
    for(int i=0;i<=9;i++)
    {
        if(a[i]==0)
        {
            cout<<i;
            return;
        }
    }
}

abc248_b

题目翻译

$a\times k^{x-1}\geq b$,问 $x$ 最小是几。

题目思路

模拟,while 循环。

AC 代码

void solve()
{
    long long a,b,k,ans=0;
    cin>>a>>b>>k;
    while(a<b)
    {
        ans++;
        a*=k;
    }
    cout<<ans<<endl;
}

abc248_c

题目翻译

从 $m$ 里选 $n$ 个数,保证 $\sum\limits_{i=1}^na_i\leq k$,问方案数。

题目思路

考虑 $f_{i,j}$ 记录 $i$ 个数和为 $j$ 的方案数。

AC 代码

const int mod=998244353;
int f[55][2505];
void solve()
{
    int n,m,k;
    cin>>n>>m>>k;
    f[1][1]=1;
    for(int i=1;i<=m;i++)
    {
        f[1][i]=1;
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            for(int kk=0;kk<k;kk++)
            {
                if(kk+j<=k)
                {
                    f[i][kk+j]+=f[i-1][kk];
                }
                else
                {
                    break;
                }
                f[i][kk+j]%=mod;
            }
        }
    }
    int ans=0;
    for(int i=0;i<=k;i++)
    {
        ans+=f[n][i];
        ans%=mod;
    }
    cout<<ans<<endl;
}

abc248_d

题目翻译

$q$ 个询问,问 $[l,r]$ 中,有多少数 $=k$。

题目思路

lower_boundupper_bound 找一下。

值和位置一起排序,两次二分,找到符合要求的区间。

AC 代码

vector<int>v[200005];
int a[200005];
void solve()
{
    int n,q;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        v[a[i]].push_back(i);
    }
    cin>>q;
    while(q--)
    {
        int l,r,k;
        cin>>l>>r>>k;
        long long ans=upper_bound(v[k].begin(),v[k].end(),r)-lower_bound(v[k].begin(),v[k].end(),l);
        cout<<ans<<endl;
    }
}

abc248_e

题目翻译

输入 $n$ 个点的坐标和一个整数 $k$,问有多少条直线通过其中恰好 $k$ 个点,如果无穷多个输出 Infinity

题目思路

$n$ 个点一共可以生成至多 $\frac{n*(n-1)}{2}$ 个直线,每个直线判断一下。

AC 代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<climits>
typedef long long ll;
using namespace std;
const int mod=998244353;
int x[305],y[305];
int check(int i,int j,int k)
{
    return (x[j]-x[i])*(y[k]-y[i])-(x[k]-x[i])*(y[j]-y[i])==0;
}
void solve()
{
    int n,k,ans=0;
    cin>>n>>k;
    if(k==1)
    {
        puts("Infinity");
        return;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>x[i]>>y[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            int sum=0;
            for(int kk=1;kk<=n;kk++)
            {
                if(check(i,j,kk))
                {
                    if(kk!=i&&kk<j)
                    {
                        sum=0;
                        break;
                    }
                    sum++;
                }
            }
            if(sum>=k)
            {
                ans++;
            }
        }
    }
    cout<<ans<<endl;
}
int main()
{
//  freopen("example.in","r",stdin);
//  freopen("example.out","w",stdout);
//  std::ios::sync_with_stdio(false);
//  cin.tie(nullptr);cout.tie(nullptr);
    int t=1;
    while(t--)
    {
        solve();
    }
    return 0;
}
最后修改:2023 年 04 月 20 日
v我50吃疯狂星期四