2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛)

 A 同源

 规律:n=n/k;

如果n%k≠0,则一定输出-1 -1 -1,去掉这个判断,通过率只有37.5%

举个例子,n=25,k=2;程序实际输出的是4 6 14,这三个数加起来等于24,不等于25,这是一个wa点

只要输出一组数据即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    return (b>0)?gcd(b,a%b):a;
}
int main()
{
    ll t;
    scanf("%lld",&t);
    while(t--)
    {
        ll f=1;
        ll n,k;
        scanf("%lld%lld",&n,&k);
        if(n%k==0)
        {
            n/=k;
            for(ll i=2; i<=10; i++)
            {
                for(ll j=2; j<=10; j++)
                {
                    ll kk=n-i-j;
                    if(kk<=1)
                        continue;
                    if(gcd(i,j)==1&&gcd(i,kk)==1&&gcd(j,kk)==1&&i!=j&&i!=kk&&j!=kk)
                    {
                        f=0;
                        printf("%lld %lld %lld
",i*k,j*k,kk*k);
                        break;
                    }
                }
                if(f==0)
                    break;
            }
        }
        if(f)
            printf("-1 -1 -1
");
    }
}

循环体中的kk表示的是第三个数,第三个数有可能会存在比2小的数,在这里需要对kk做一个特判,如果小于2则跳过j++,否则根据题目意思进行判断,找到了用f标记一下,f=0即为找到,直接跳出两个for循环体,未找到,将在循环外输出默认的-1 -1 -1。

为了让运行时间更短对i和j进行了限制,规定循环均只从2~10,至于kk只要大于等于2即可,大大压缩了时间。

B 分子

 字符串模拟

s表示最终的分子量,sum表示部分的分子量,为临时变量,num表示数字下标

读到'('的时候把临时变量sum加到s上,清空sum内容,准备读取括号内部的分子量。如果读到数字,从左到右一位一位的读入到num中,若下一个字符是非数字字符(包括后括号和字母),则清空num中的内容,同理读到')',也是一样的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string str;
ll ele(ll i)
{
    if(str[i]=='C')
        return 13;
    if(str[i]=='H')
        return 1;
    if(str[i]=='O')
        return 17;
}
int main()
{
    cin>>str;
    ll len=str.length();
    ll s=0,sum=0,e,num=0;
    ll i=0;
    while(i<len)
    {
        if(str[i]=='C'||str[i]=='H'||str[i]=='O')
        {
            e=ele(i);
            i++;
            while(str[i]>='0'&&str[i]<='9')
            {
                num=num*10+str[i]-'0';
                i++;
            }
            if(num)
            {
                e*=num;
                num=0;
            }
            sum+=e;
        }
        if(str[i]=='(')
        {
            i++;
            s+=sum;
            sum=0;
        }
        if(str[i]==')')
        {
            i++;
            while(str[i]>='0'&&str[i]<='9')
            {
                num=num*10+str[i]-'0';
                i++;
            }
            if(num)
            {
                sum*=num;
                num=0;
            }
            s+=sum;
            sum=0;
        }
    }
    printf("%lld
",s+sum);
}

C 爵士

 水题,用getline读取每一行的字符串,判断更字符串内是否含有2,s2++,输出 s/ 全部字符串(n) ,保留10位小数。

#include <bits/stdc++.h>
#define T int t ;cin >> t;while(t--)
using namespace std ;
typedef long long ll;
int main()
{
    T
    {
        ll n;
        scanf("%lld",&n);
        double s2=0,sall=n;
        string s;
        getchar();
        while(n--)
        {
            getline(cin,s);
            for(ll j=0; j<s.length(); j++)
            {
                if(s[j]=='2')
                {
                    s2++;
                    break;
                }
            }
        }
        double sum=0;
        sum=s2/sall;
        printf("%.10lf
",sum);
    }
}

 

E-内存

 

大模拟

F 游戏

不管如何,输出Yes就对了

C++14最短代码:

#include<cstdio>
main(){int t;scanf("%d",&t);while(t--)printf("Yes
");}
原文地址:https://www.cnblogs.com/jackwang-sparrow/p/13444845.html