2021 ICPC 江西省大学生程序设计竞赛(正式赛)

本文提供了三道ACM编程竞赛题目的解决方案,包括错误的DFS题解、连分数表示及区间覆盖问题,涉及数据结构、算法优化等核心知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A-Mio visits ACGN Exhibition

先提供一个错误的题解(dfs成功tle)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ans,mod=998244353,a[510][510],n,m,p,q;
ll qpow(ll x,ll n){
    ll res=1;
    while(n){
        if(n&1)res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}
ll inv(ll x){ return qpow(x,mod-2); }
ll C(ll x,ll y){
    ll res=1;
    if(2*x>y)x=y-x;
    for(ll i=1;i<=x;i++)
        res=res*(y-i+1)%mod*inv(i)%mod;
    return res;
}
void dfs(ll x,ll y,ll cnt0,ll cnt1){
    cnt0+=(a[x][y]==0);
    cnt1+=(a[x][y]==1);
    if(cnt0>=p && cnt1>=q){
        ans+=C(n-x,m-x+n-y);
        ans%=mod;
    }
    else{
        if(x<n)dfs(x+1,y,cnt0,cnt1);
        if(y<m)dfs(x,y+1,cnt0,cnt1);
    }
    return;
}
int main(){
    cin>>n>>m>>p>>q;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    dfs(1,1,0,0);
    cout<<ans<<endl;
}

B- Continued Fraction

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int gcd(int a ,int b){
    return !b ? a : gcd(b,a%b);
}
int a[10000];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    ll t,n,m,fac;
    cin>>t;
    while(t--){// m/n
        ll cnt=0;
        cin>>m>>n;
        while(n!=1){
            a[cnt++]=m/n;
            m=m-(m/n)*n;
            fac=gcd(m,n);
            m/=fac,n/=fac;
            swap(m,n);
        }
        cout<<cnt<<' ';
        for(int i=0;i<cnt;i++)cout<<a[i]<<' ';
        cout<<m<<endl;
    }
    return 0;
}

K-Many Littles Make a Mickle

题目大意:总共n层,每层n个房间,每个房间m个人,求总共可以多少人

sol:ans=m\sum i^{2}=\frac{mn(n+1)(2n+1)}{6} 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll t,n,m;
    cin>>t;
    while(t--){
        cin>>n>>m;
        cout<<(n+1)*n/2*(2*n+1)*m/3<<endl;
    }
    return 0;
}


 L-It Rains Again

#include<iostream>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
int n,x1,x2,y1,y2,l,r,len;
vector< pair<int,int> > a;
bool cmp(pair<int,int> p1,pair<int,int> p2){
    return p1.first<p2.first;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x1>>y1>>x2>>y2;
        a.push_back( make_pair(x1,x2) );
    }
    sort(a.begin(),a.end(),cmp);
    l=a[0].first,r=a[0].second;

    for(int i=1;i<a.size();i++){
        if(a[i].first<=r){
            r=max(r,a[i].second);
        }
        else {
            len+=r-l;
            l=a[i].first;
            r=a[i].second;
        }
    }
    len+=r-l;
    cout<<len;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值