ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtCoder Beginner Contest 262 题解

2022-08-03 12:32:32  阅读:166  来源: 互联网

标签:AtCoder 数字 int 题解 ++ 262 solve ans


AtCoder Beginner Contest 262

A - World Cup

题解:循环判断即可

#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n;
    cin>>n;
    for(int i=n;;i++)
    {
        if(i%4==2)
        {
            cout<<i<<'\n';
            return;
        }
    }
}
int main()
{
    int T=1;
    while(T--) solve();
    return 0^0;
}

B - Triangle (Easier)

题意: 给定\(n\)点,\(m\)条边,如果\(a,b,c\)相连,那么\(ans++\),求\(ans\)

题解:观察到\(n\) \(\le\) \(100\) 可以直接暴力循环判断,然后直接搞

#include <bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);
typedef pair<int,int> PII;
void solve()
{
    int n,m;
    cin>>n>>m;
    map<PII,int> mp;
    for(int i=0;i<m;i++)
    {
        int a,b;
        cin>>a>>b;
        mp[{a,b}]++;//模拟连边
        mp[{b,a}]++;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            for(int k=j+1;k<=n;k++)
            {
                if(mp[{i,j}]&&mp[{i,k}]&&mp[{j,k}])//表示连接了
                {
                    ans++;
                }
            }
        }
    }
    cout<<ans<<'\n';
}
int main()
{
    int T=1;
 //   cin>>T;
    while(T--) solve();
    return 0^0;
}

C - Min Max Pair

题意:给定\(n\)个数字,并且数字范围是\(1\)到\(n\),然后如果满足以下等式那么就\(ans\)++,求\(ans\)的个数:

  1. \(1 \le i<j \le N\)
  2. \(min(a_i,a_j)=i\)
  3. \(max(a_i,a_j)=j\)

题解:这里有两种情况要考虑.

  1. 当\(a_i=i\)的时候,这时候另一个就是\(a_j=j\),这里可以发现所以的\(a_i=i\)两两之间都可以进行相应的排列组合,,比并且这里就是组合数\(C_{n}^{2}\)(就是两两组合)
  2. 当\(a_i!=i\)的时候,那么他肯定是这样的\(a_i=j\)和\(a_j=i\)这两个组合,那么就可以直接找,然后进判断.

code

#include <bits/stdc++.h>
using namespace std;
const double PI=acos(-1.0);
typedef long long ll;
void solve()
{
    int n;
    cin>>n;
    vector<int> q(n+1);
    for(int i=1;i<=n;i++) cin>>q[i];
    ll ans=0;
    vector<int> st(n+1,true);
    for(int i=1;i<=n;i++)
    {
        if(q[i]!=i)
        {
            if(q[q[i]]==i&&st[i]&&st[q[i]])
            {
                ans++;//这个统计的是第二种情况,
                st[i]=false;//防止重复出现
                st[q[i]]=false;
            }
        }
    }
    // cout<<ans<<'\n';
    ll temp=0;
    for(int i=1;i<=n;i++) temp+=(q[i]==i);//第一种情况
    // cout<<temp<<'\n';
    ans+=(ll)(temp*(temp-1)/2);//组合数C_{n}^{2}
    cout<<ans<<'\n';
}
int main()
{
    int T=1;
    //cin>>T;
    while(T--) solve();
    return 0^0;
}

D - I Hate Non-integer Number

题意:给定\(n\)个数字,对于\(n\)个数字组成的所有的非空子集,他的子集元素所组成的算数平均数是整数的子集个数有多少个? 答案对于\(998244353\)进行取模

题解: 显示要考虑\(DP\),但是比赛的时候并不会,还是赛后会的...

设\(f[i][j][k][b]\)表示前\(i\)个数字,选\(j\)个,\(模k\)的情况下等于b的方案数

  1. \(f[i+1][j+1][k][(b+x)\% k]+=f[i][j][k][b]%mod\);选\(x\)这个数字
  2. \(f[i+1][j][k][b]+=f[i][j][k][b]\);不选\(x\)这个数字

code

#include <bits/stdc++.h>
using namespace std;
const int N=101;
const int mod=998244353;;
ll f[N][N][N][N];
//表示的是前i个数字,选j个,在模k的情况下等于b的方案数
void solve()
{
    int n;
    cin>>n;
    for(int i=0;i<=n;i++) f[0][0][i][0]=1;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        for(int j=0;j<=i;j++)
        {
            for(int k=1;k<=n;k++)
            {
                for(int b=0;b<=n;b++)
                {
                    f[i+1][j+1][k][(b+x)%k]=(f[i+1][j+1][k][(b+x)%k]+f[i][j][k][b])%mod;//选这个数字
                    f[i+1][j][k][b]=(f[i+1][j][k][b]+f[i][j][k][b])%mod;//不选这个数字
                }
            }
        }
    }
    ll ans=0;
    for(int i=1;i<=n;i++) ans=(ans+f[n][i][i][0])%mod;
    cout<<ans<<'\n';
}
int main()
{
    int T=1;

    while(T--) solve();
    return 0^0;
}

标签:AtCoder,数字,int,题解,++,262,solve,ans
来源: https://www.cnblogs.com/Meteor-Z/p/16546637.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有