ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-23 10:03:07  阅读:248  来源: 互联网

标签:arr 酒店 int 机器人 Codeforces mp 495 Div include


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有