第20届上海大学程序设计联赛夏季赛 题解

补题,一年之后还是不会做😭


A. 中奖

题面

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+5;
struct p
{
    int a,b,c;
}s[N];
bool cmp(p a,p b)
{
    if(a.c>b.c)
        return true;
    else if(a.c<b.c)
        return false;
    else
    {
        if(a.a<b.a)
            return true;
        else if(a.a>b.a)
            return false;
        else
            return a.b<b.b;
    }
}
int main() {
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>s[i].a>>s[i].b>>s[i].c;
    sort(s+1,s+1+n,cmp);
    for(int i=1;i<=m;i++)
        cout<<s[i].a<<' '<<s[i].b<<' '<<s[i].c<<'\n';
    return 0;
}

B. 构造一个简单的数列

题面

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
bool vis[N];
int main() {
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--)
    {
        int a,n;
        cin>>a>>n;
        if(a==1)
            cout<<n<<'\n';
        else if(n==1)
            cout<<a<<'\n';
        else
        {
            if(a>=n)
                cout<<n-1<<'\n';
            else
            {
                if(a%2==0)
                    cout<<n<<'\n';
                else
                {
                    memset(vis,false,sizeof(vis));
                    for(int i=1;i<=a;i++)
                        vis[i]=true;
                    int last=a-1;
                    int b=a;
                    while(b<n)
                    {
                        for(int i=last+2;i<=b;i++)
                            vis[i]=true;
                        last=b-1;
                        for(int i=last+1;i<1e6+5;i++)
                        {
                            if(!vis[i]&&__gcd(i,last)==1)
                            {
                                b=i;
                                break;
                            }
                        }
                    }
                    if(n==last+2)
                        cout<<b<<'\n';
                    else
                        cout<<n-1<<'\n';
                }
            }
        }
    }
    return 0;
}

E. 排列计数

题面

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main() {
    ios::sync_with_stdio(false);
    ll n;
    cin>>n;
    if(n==1)
        cout<<1<<'\n';
    else
    {
        ll ans=1;
        for(int i=3;i<=2*n;i++)
            ans=(ans*i)%mod;
        cout<<ans<<'\n';
    }    
    return 0;
}

H. 拼接的字符串

题面

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    ios::sync_with_stdio(false);
    string s1,s2;
    cin>>s1>>s2;
    int len=s1.length();
    int i=0,j=len-1;
    for(i=0;i<len;i++)
    {
        if(s1[i]!=s2[i])
            break;
    }
    for(j=0;j<len;j++)
    {
        if(s1[len-1-j]!=s2[s2.length()-1-j])
            break;
    }
    if(i+j>=len)
        cout<<"YES"<<'\n';
    else
        cout<<"NO"<<'\n';
    return 0;
}

I. 没有字母的数

题面

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool is_alpha(int x)
{
    while(x)
    {
        if(x%16>=10)
            return false;
        x/=16;
    }
    return true;
}
const int N=1e6+5;
int sum[N];
void init()
{
    for(int i=1;i<N;i++)
        sum[i]=sum[i-1]+is_alpha(i);
}
int main() {
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    init();
    while(T--)
    {
        int l,r;
        cin>>l>>r;
        cout<<sum[r]-sum[l-1]<<'\n';
    }
    return 0;
}

img_show