其他分享
首页 > 其他分享> > Codeforces Round #495 (Div. 2) A,B,C

Codeforces Round #495 (Div. 2) A,B,C

作者:互联网

A题

1.新添加一间酒店,要求酒店离已有的最近的一间酒店的距离恰好等于d

2.最左和最右必定存在合适的两种情况

3.酒店之间的情况就要判断两间酒店间的距离:

小于2d,表示无法在这两间酒店中间找到合适情况
等于2d,表示这两间酒店的正中间可以满足条件,新建酒店
大于2d,表示这两间酒店之间存在两种满足条件的情况

 1 #include<bits/stdc++.h>
 2 
 3 /*
 4 
 5 -6 0 5 6 12 13 19
 6 
 7 2 6 10 13 16 21 
 8 */
 9 using namespace std;
10 #define int long long 
11 #define N 209
12 map<int,int> mp;
13 int arr[N];
14 signed main(){
15     int n,d;
16     cin>>n>>d;
17     for(int i=1;i<=n;i++)
18     {
19         cin>>arr[i];
20         mp[arr[i]]=1;
21     }
22     if(n==1){
23         cout<<2;
24         return 0;
25     }
26     sort(arr+1,arr+1+n);
27     int sum=0;
28     for(int i=1;i<=n;i++){
29         if(i==1){
30             if(!mp[arr[i]+d]&&(arr[i+1]-(arr[i]+d))>=d){
31             mp[arr[i]+d]=1;
32         //    cout<<arr[i]+d<<endl;
33             sum++;
34             }
35             continue;
36         }
37         if(i==n){
38             if(!mp[arr[i]-d]&&(arr[i]-d-arr[i-1])>=d){
39             mp[arr[i]-d]=1;
40         //    cout<<arr[i]-d<<endl;
41             sum++;
42             }
43             continue;
44         }
45         if(!mp[arr[i]-d]&&(arr[i]-d-arr[i-1])>=d){
46             mp[arr[i]-d]=1;
47         //    cout<<arr[i]-d<<endl;
48             sum++;
49         }
50         if(!mp[arr[i]+d]&&(arr[i+1]-(arr[i]+d))>=d){
51             mp[arr[i]+d]=1;
52         //    cout<<arr[i]+d<<endl;
53             sum++;
54         }
55     }
56     printf("%d\n",sum+2);
57     return 0;
58 }
59 
60 /*
61 3 2
62 4 4
63 5 6
64 6 9
65 */
66 
67 */

 

B题

题意:有一排n个格子,每个格子里能放一种花,一共有两种花,一种用 0 代表,另一种用 1 代表,然后给你m各区间,每个区间的价值就是这个区间内的两种花的数量之积。问你应该怎么放花,使得这些区间的价值和最大。

思路:就是说让0 1 的个数在各个区间内都是接近的(和相等,越接近,积越大),也就是说0 1 分布均匀,那么,我们直接0 1 交替输出,就可以保证0 1 在各个区间都是最接近的。

AC代码:

#include<bits/stdc++.h>

using namespace std;
#define N 200505
struct str{
    int l,r;
    int cha;
}st[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>st[i].l>>st[i].r;
    
    }
    for(int i=1;i<=n;i++){
        if(i%2)
            cout<<1;
        else
            cout<<0;
    }
    
    return 0;
} 
/*
2 1
3 2
4 4
5 6
6 9
101010
2+4+2

101010
1+4+2
*/

/**/

C题:

题意:给出一个长为n的数列(数字可以重复),表示在i号位置的数字为ai。.现在,在数列的最左和最右端有一个报数机器人,最左端的机器人向右移动,最右端的机器人向左移动,每移动到一个位置时,机器人就会将这个位置的数字报出来。现在,每个机器人都有一个编号,如果机器人报出来的数字和这个编号相同的话,机器人就会停止移动。
问,这两个机器人的编号有多少种情况,可以使这两个机器人不发生碰撞。
思路:跑后缀就行。用MAP标记超时了QAQ
AC代码:
 1 #include<map>
 2 #include<stdio.h>
 3 #include<iostream>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 #define int long long
 9 #define N  250000
10 int arr[N];
11 int sum[N];
12 int mp[N];
13 int mmp[N];
14 signed main(){
15     int n;
16     cin>>n;
17     for(int i=1;i<=n;i++)
18         scanf("%lld",&arr[i]);
19     int add=0;
20 
21     for(int  i=n;i>=1;i--){
22         sum[i]=add;
23         if(!mmp[arr[i]])
24             add++;
25         mmp[arr[i]]=1;
26     }
27     int ans=0;
28     for(int i=1;i<=n;i++){
29         if(mp[arr[i]])
30             continue;
31         ans+=sum[i];
32         mp[arr[i]]=1;
33     }
34     cout<<ans;
35     return 0;
36 }

 

标签:arr,酒店,int,机器人,Codeforces,mp,495,Div,include
来源: https://www.cnblogs.com/pengge666/p/11570719.html