“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛(2020-5-10)

“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛

地址:https://ac.nowcoder.com/acm/contest/5477#question

A 张老师和菜哭武的游戏

1到n中,如果p能被拿走,则一定满足p=x*a+y*b,所以p一定是a,b最小公因数的倍数,所以最后判断奇偶即可

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<vector>
 4 #include<queue>
 5 #include<string>
 6 #include<list>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 # define PI 3.14159265358979323846
11 using namespace std;
12 typedef long long ll;
13 const int maxn = 2e5+10;
14 const int mod = 11092019;
15 int main()
16 {
17     int t;
18     cin>>t;
19     while(t--)
20     {
21         int n,a,b;
22         cin>>n>>a>>b;
23         int f = n/__gcd(a,b);
24         if(f%2==0) cout<<"No"<<endl;
25         else cout<<"Yes"<<endl;
26     }
27     return 0;
28 } 

 

B 伤害计算

以“+”号分割字符串,分为两类:含有d和没有d,注意:最好全程都用int,最后/2;

输出浮点数的时候,如果有1000000之类的数可能会输出成1e+06的形式 

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<vector>
 4 #include<queue>
 5 #include<string>
 6 #include<list>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 # define PI 3.14159265358979323846
11 using namespace std;
12 typedef long long ll;
13 const int maxn = 2e5+10;
14 const int mod = 11092019;
15 int main()
16 {
17     vector<string> v;
18     string s;
19     cin>>s;
20     string t;
21     for(int i=0;i<s.length();i++)
22     {
23         if(s[i]!='+')
24         {
25             t+=s[i];
26         }
27         else
28         {
29             v.push_back(t);
30             t.clear();
31         }
32         if(i==s.length()-1) v.push_back(t);
33     }
34     
35     
36 //    for(auto it=v.begin();it!=v.end();it++){
37 //        cout<<*it<<endl;
38 //    }
39     
40     
41     int sum1 = 0;
42     int sum2 = 0;
43     for(auto it=v.begin();it!=v.end();it++)
44     {
45         string x = *it;
46         if(x.find('d')!=x.npos)
47         {
48             int a=0,b=0;
49             int i=0;
50             for(i;i<x.length();i++)
51             {
52                 if(x[i]!='d')
53                 {
54                     a = a*10+(x[i]-'0');
55                 }
56                 else
57                 {
58                     i++;
59                     break;
60                 }
61             }
62             for(i;i<x.length();i++)
63             {
64                 b = b*10+(x[i]-'0');
65             }
66 //            cout<<a<<" "<<b<<endl;
67             sum1+=a*(b+1);
68         }
69         else
70         {
71             int p = 0;
72             for(int i=0;i<x.length();i++)
73             {
74                 p = p*10+(x[i]-'0');
75             }
76 //            cout<<p<<endl; 
77 //                     为了使用int,现加双份,最后/2
78             sum2 += p+p;
79             
80         }
81     }
82     int sum = sum1+sum2;
83     if(sum%2==0) cout<<sum/2<<endl;
84     else cout<<sum/2<<".5"<<endl;
85     return 0;
86 } 

F 排列计算

知识点:差分前缀和;

前缀和:就是一个数组,要快速静态查询区间和,我们只要处理一个数组时A[i]=a[1]+a[2]+...+a[i].

那么查询区间[l,r]的时候只要输出A[r]-A[l-1].

差分数组 :多次在给定数组的某区间加上某数,使用差分数组可以加快运算速度。

 1 #include<bits/stdc++.h>
 2 #include<iostream>
 3 #include<vector>
 4 #include<queue>
 5 #include<string>
 6 #include<list>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 # define PI 3.14159265358979323846
11 using namespace std;
12 typedef long long ll;
13 const int maxn = 2e5+10;
14 const int mod = 11092019;
15 int main()
16 {
17     ll node[maxn]={0};
18     ll n,m;
19     cin>>n>>m;
20     while(m--)
21     {
22         ll a,b;
23         cin>>a>>b;
24         node[a]++;
25         node[b+1]--;
26     }
27     for(ll i=1;i<=n;i++)
28     {
29         node[i]+=node[i-1];
30     }
31     sort(node+1,node+n+1);
32     ll x = 1;
33     ll ans = 0;
34     for(ll i=1;i<=n;i++)
35     {
36         ans+=node[i]*x;
37         x++;
38     }
39     cout<<ans<<endl;
40     return 0;
41 } 
原文地址:https://www.cnblogs.com/subject/p/12871886.html