2020.4.12 个人rating赛 解题+补题报告

A. Balloons

 1.题意

  n包气球,每包气球有ai个,将这n包气球以包为单位全部分给两个人,要求每人至少有一包气球且两人气球总个数不能相等。

 2.题解

  用结构体将n包气球的编号和气球数存起来,按每包气球个数排序后,如果第一包气球的个数不为总个数的一半,满足题意。

 3.代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 struct node{
 5     int id,x;
 6 }a[15];
 7 bool cmp(node a,node b){
 8     return a.x<b.x;
 9 }
10 int main () {
11     ios::sync_with_stdio(false);
12     cin>>n;
13     
14     int sum=0;
15     for(int i=1;i<=n;i++){
16         cin>>a[i].x;
17         a[i].id=i;
18         sum+=a[i].x;
19     }
20     if(n==1){
21         cout<<-1<<endl;
22         return 0;
23     }
24     sort(a+1,a+1+n,cmp);
25     if(a[1].x*2==sum)
26         cout<<-1<<endl;
27     else{
28         cout<<1<<endl;
29         cout<<a[1].id<<endl;
30     }

D. Sonya and Hotels

 1.题意

  有n个酒店分布在一条坐标轴上,酒店只能在整数点上,Sonya想再建一个酒店,要求这个酒店与其它所有酒店的最小距离等于d,问有多少种建造位置。

 2.题解

  第一个酒店的左边和最后一和酒店的右边肯定符合题意,从第二个酒店向后遍历,如果与前一个酒店的距离等于两倍的d,说明这两个酒店之间恰好有一个可以建造的位置,如果与前一个酒店的距离大于两倍的d,说明这两个酒店之间有两个可以建造的位置。

 3.代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,d,ans;
 4 int a[110]; 
 5 int main(){
 6     ios::sync_with_stdio(false);
 7     cin>>n>>d;
 8     for(int i=1;i<=n;i++)
 9         cin>>a[i];
10         
11     for (int i=2;i<=n;i++){
12         if(a[i]-a[i-1]==d+d)
13             ans++; 
14         if(a[i]-a[i-1]>d+d)
15                ans+=2;     
16     }
17     cout<<ans+2<<endl;
18     
19     return 0;
20 }

 E. Sonya and Exhibition

 1.题意

  展览上有百合和玫瑰两种花共n株呈直线排开,有m个游客,每个游客对展览的满意程度为从L到R之间玫瑰的数量乘以百合的数量,问怎样排列这n株花使得展览的受欢迎程度最大。

 2.题解

  思维题,要使得百合乘以玫瑰的数量和最大,将它们错位排列最好,即01010101排列。

 3.代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 struct node{
 5     int l,r;
 6 }a[10005]; 
 7 int main(){
 8     ios::sync_with_stdio(false);
 9     cin>>n>>m;
10     for(int i=1;i<=m;i++)
11         cin>>a[i].l>>a[i].r;
12         
13     for(int i=1;i<=n;i++){
14         if(i%2)
15             cout<<0; 
16         else
17                cout<<1; 
18     }
19     
20     return 0;
21 }

F. Sonya and Robots

 1.题意

  n个数,从每个数起向后找一个数,使得这两个数组成一个数字对,求一共有多少个不同的数字对。

 2.题解

  从前往后遍历,更新每种数字左边一共有多少个不同的数字,这些数字可以与当前数字可以构成一个数字对。

 3.代码

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N=100005;
 5 int n;
 6 int a[N],vis[N];
 7 set<int>st;
 8 int main(){ 
 9     ios::sync_with_stdio(false);
10     cin>>n;
11     for(int i=0;i<n;i++){
12         cin>>a[i];
13         vis[a[i]]=st.size();
14         st.insert(a[i]);
15     }
16     ll ans=0;
17     for(int i=0;i<=N;i++)
18         ans+=vis[i];
19         
20     cout<<ans<<endl;
21     
22     return 0;
23 }

 

猜你喜欢

转载自www.cnblogs.com/lvguapi/p/12687029.html