• 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
    ",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 }
  • 相关阅读:
    hdu 1088 HTML解析
    hdu1171 转化01背包,组合
    Java编程优化之旅(一)一般化方法
    Java简单实现Socket非阻塞通信
    Maven安装,以及导入Intellij IDEA
    笔记本的使用技巧
    Intellij IDEA使用小技巧
    学习Spring有关知识
    学习安装IntelliJ IDEA
    C#后台调用js方法无效果,未解决。
  • 原文地址:https://www.cnblogs.com/pengge666/p/11570719.html
Copyright © 2020-2023  润新知