2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛水题

Powered by:AB_IN 局外人

终于看见清楚姐姐了!!

A 同源

m=n/k之后的值,便是三个质数的和。
其中两个用循环枚举一下(枚举前一百就差不多了,最后一个很大也没关系),另为一个用 m m m减去就行了。
数据比较多,用scanf不会T。

#include
using namespace std;
typedef long long ll;
ll t,n,k;
int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&n,&k);
        if(n%k!=0)  puts("-1 -1 -1");
        else{
            int flag=0;
            ll m=n/k;
            for(ll i=2;i<=102;i++){
                for(ll j=2;j<=102;j++){
                    ll h=m-i-j;
                    if(h<=1) continue;
                    if(__gcd(i,j)==1&&__gcd(i,h)==1&&__gcd(h,j)==1){
                        printf("%lld %lld %lld\n",k*i,k*j,k*h);
                        flag=1;
                        break;
                    }
                }
                if(flag) break;
            }
            if(!flag) puts("-1 -1 -1");
        }
    }
}

B 分子

我用 P y t h o n Python Python做的.
思路就是先把字符串用左括号分开,形成列表。然后按照规则去加原子质量。

  • a n s ans ans是列表中一项的一个分子的原子质量和。
  • t m p tmp tmp是列表中一项的原子质量和。
  • c n t cnt cnt是列表原子质量和。
  • 凡是数字和右括号都省略。

其中有一步是判断分子后面数字是几的,挺重要。
代码挺好懂的。

要是用C++的话,可以用做,将字母转换成数字的话,就是
数字字符-'0'就可以获得 i n t int int类型的这个数字。

num=['0','1','2','3','4','5','6','7','8','9']
s=list(input().split("("))
cnt=0
#print(s)
for i in s:
    ans=0
    tmp=0
    for j in range(len(i)):
        ans=0
        n=''
        c=j+1
        while c<len(i) and i[c] in num:
            n=n+i[c]
            c+=1
        
        if i[j]==")":
            if n=='':
                continue
            ans+=tmp*(int(n)-1)
        
        if i[j]=="H" and n!='':
            ans+=1*int(n)
        elif i[j]=="H":
            ans+=1
        
        if i[j]=="C" and n!='':
            ans+=13*int(n)
        elif i[j]=="C":
            ans+=13
        
        if i[j]=="O" and n!='':
            ans+=17*int(n)
        elif i[j]=="O":
            ans+=17
            
        tmp+=ans
        cnt+=ans
        
        
print(cnt)

C 爵士

签到啦!

t=int(input())
while t>0:
    t-=1
    n=int(input())
    ans=0
    for i in range(1,n+1):
        s=input()
        if s.count("2")>0:
            ans+=1
    print(f'{(ans/n):.10f}')

F 游戏

这才是真正的签到题。。。
原理不太懂,有位大佬写了 ,挂一下,不让就删掉。。。
反正先手一定赢。

#include 
using namespace std; 
char a[1000000];
 
int main() {
    int t;
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        for (int i = 1; i <= n;i++) {
            int u, v;
            cin >> u >> v;
        }
        cout << "Yes\n";//不用写endl,可以直接写\n
    }
}

完结。

你可能感兴趣的:(ACM,程序设计)