The 15th Chinese Northeast Collegiate Programming Contest部分题解

The 15th Chinese Northeast Collegiate Programming Contest

  • 目录
    • E. Easy Math Problem
      • 题目思路
      • 题目代码
    • I. Takeaway
      • 题目思路
      • 题目代码
    • K. City
      • 题目思路
      • 题目代码
    • M. Master of Shuangpin
      • 题目思路
      • 题目代码
  • 结语

目录

E. Easy Math Problem

题目思路

给p,问是否有一个数字k为p的倍数,且k可以表示为k的某些因数之和,输出方案。
签到题,可以发现 p1+p2+p3 = p6,正好满足情况,具体是随便 i j k暴力找一下类似的情况就可以。

题目代码

#include
using namespace std;
typedef long long int ll;
ll t;
ll n;
int main()
{
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        ll m=n*6;
        printf("%lld 3\n",n*6);
        for(int i=1;i<3;i++){
            printf("%lld ",i*n);
        }
        printf("%lld\n",3*n);
 
    }
    return 0;
}

I. Takeaway

题目思路

根据题目模拟。

题目代码

#include
using namespace std;
int t;
int n;
int a[10];
int b[10]={7,27,41,49,63,78,108};
int main()
{
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        int sum=0;
        for(int i=0;i<n;i++){
            int cnt=b[a[i]-1];
            //cout<
            sum+=cnt;
            //cout<

        }
        if(sum>=120){
                sum-=50;
        }
        else if(sum>=89){
            sum-=30;
        }
        else if(sum>=69){
            sum-=15;
        }
        cout<<sum<<endl;
    }
    return 0;
}

K. City

题目思路

无向图,Q次询问,每次询问给定k值,小于k的边无效,问当前多少点对可达。
询问离线,将k值和边权排序,从大到小并查集不断加边,计算贡献即可。

题目代码

#include
using namespace std;
typedef long long int ll;
const ll maxn=2e5+10;
ll n,m,k;
map<ll,ll> mp,vis;
ll f[maxn],sz[maxn];
struct node{
    ll u,v,w;
    bool operator<(const node &rh)const{
        return w>rh.w;
    }
}p[maxn];
struct que{
    ll id;
    ll x;
    bool operator<(const que &rh)const{
        return x>rh.x;
    }
}q[maxn];
ll ans[maxn];
void init(){
    for(int i=0;i<=n;i++){
        f[i]=i;
        sz[i]=1;
    }
}
ll fi(ll x){
    if(x==f[x])return x;
    return f[x]=fi (f[x]);
}
int main()
{
    int t;
    scanf("%lld",&t);
    while(t--){
        ll sum=0;
        scanf("%lld%lld%lld",&n,&m,&k);
        for(int i=1;i<=m;i++){
            scanf("%lld%lld%lld",&p[i].u,&p[i].v,&p[i].w);
        }
        sort(p+1,p+1+m);
        for(int i=1;i<=k;i++){
            ll x;
            scanf("%lld",&q[i].x);
            q[i].id=i;
        }
        sort(q+1,q+1+k);
        for(int i=0;i<=n;i++){
            f[i]=i;
            sz[i]=1ll;
        }
        int j=1;
        for(int i=1;i<=k;i++){
            ll val=q[i].x;
            //cout<
            while(j<=m&&p[j].w>=val){
                ll xx=fi(p[j].u);
                ll yy=fi(p[j].v);
                if(xx!=yy){
                    sum+=1ll*sz[yy]*sz[xx];
                    f[xx]=yy;
                    sz[yy]+=sz[xx];
                }
                j++;
            }
            ans[q[i].id]=sum;
           // cout<
            //cout<
        }
        for(int i=1;i<=k;i++){
            printf("%lld\n",ans[i]);
        }
    }
    return 0;
}

M. Master of Shuangpin

题目思路

根据拼音转双拼模拟。几点注意情况都进行判断下即可

题目代码

#include
using namespace std;
typedef long long int ll;
const ll maxn=1e5+10;
const ll mod=998244353;
map<string,string> mp;
string s;
int main()
{
    mp["iu"]="q";
    mp["ei"]="w";
    mp["uan"]="r";
    mp["ue"]="t";
    mp["un"]="y";
    mp["sh"]="u";
    mp["ch"]="i";
    mp["uo"]="o";
    mp["ie"]="p";
    mp["ong"]="s";
    mp["iong"]="s";
    mp["ai"]="d";
    mp["en"]="f";
    mp["eng"]="g";
    mp["ang"]="h";
    mp["an"]="j";
    mp["uai"]="k";
    mp["ing"]="k";
    mp["uang"]="l";
    mp["iang"]="l";
    mp["ou"]="z";
    mp["ia"]="x";
    mp["ua"]="x";
    mp["ao"]="c";
    mp["zh"]="v";
    mp["ui"]="v";
    mp["in"]="b";
    mp["iao"]="n";
    mp["ian"]="m";


    for(int i=0;i<26;i++){
        string ss="a";
        ss[0]+=i;
        mp[ss]=ss;
    }
    while(cin>>s){
        if(s.size()==1){
            cout<<s<<s;
        }else if(s.size()==2){
            cout<<s;
        }else{
            if(mp.find(s)!=mp.end()){
                cout<<s[0]<<mp[s];
            }else{
                string str1,str2;
                ll f=0;
                for(int i=1;i<s.size();i++){
                    str1=s.substr(0,i);
                    str2=s.substr(i,s.size()-i);
                    if(mp.find(str1)!=mp.end()&&mp.find(str2)!=mp.end()){
                        cout<<mp[str1]<<mp[str2];
                        break;
                    }
                }
            }
        }
        char c=getchar();
        cout<<c;
    }
    return 0;
}

结语


“遇事不决,可问春风。春风不语,即随本心。”的意思是:对一件事犹豫不决,就问春风该如何做,春风给不出答案,就凭自己本心做出决断。“遇事不决可问春风,春风不语即随本心”一句出自网络作家“烽火戏诸侯”的《剑来》,其原文是:“遇事不决,可问春风。春风不语,遵循己心”。

The 15th Chinese Northeast Collegiate Programming Contest部分题解_第1张图片


你可能感兴趣的:(竞赛,c++,算法,图论)