当前位置: 首页 > news >正文

Codeforces Round #352 (Div. 2)

 

模拟 A - Summer Camp

#include <bits/stdc++.h>

int a[1100];
int b[100];
int len;

void init() {
    int i = 1, tot = 1;
    while (tot <= 1010) {
        int t = i, c = 0;
        while (t) {
            b[c++] = t % 10;
            t /= 10;
        }
        for (int i=c-1; i>=0; --i) {
            a[tot++] = b[i];
        }
        i++;
    }
}

int main() {
    init ();
    int n; scanf ("%d", &n);
    printf ("%d", a[n]);
    return 0;
}

构造 B - Different is Good

题意:问最少改变多少个字母使得该字符串的所有子串不相同

分析:子串有长度为1的,所以如果字符串长度大于26一定不可行,否则就把相同的字母用没出现的字母替换.

#include <bits/stdc++.h>

const int N = 1e5 + 5;
char str[N];
int vis[30];

int main() {
    int n; scanf ("%d%s", &n, str);
    if (n > 26) {
        puts ("-1");
    } else {
        int ans = 0;
        for (int i=0; i<n; ++i) {
            if (vis[str[i]-'a']) {
                ans++;
            } else {
                vis[str[i]-'a'] = true;
            }
        }
        printf ("%d\n", ans);
    }
    return 0;
}

几何+贪心 C - Recycling Bottles

题意:A和B捡罐头,每次只能捡一个然后到垃圾桶去,再从垃圾桶出发去捡,问捡完所有罐头所需的最少总路程

分析:除从A或B出发第一次捡罐头的距离不确定外,其他的都可以看成sum (dis (T, p[i]) *2),所以只需要 min (-dis (T, p[i]) + dis (A, p[i])).因为A和B捡罐头是独立的,只要A和B都捡一个罐头使得差值最小,重复时特判下就行了.更一般的做法是A任意选择一个罐头,B选择除A选的外里最小差值的那一个,可以预处理出前缀最小和后缀最小.

#include <bits/stdc++.h>

const int N = 1e5 + 5;
const double INF = 1e18 + 5;
const double EPS = 1e-8;
struct Point {
    double x, y;
    Point() {}
    Point(double x, double y) {
        this->x = x;
        this->y = y;
    }
}point[N];
Point A, B, O;
double dis[N];
double sum;
double pre[N], suff[N];
double add[N];
int n;

Point read_point() {
    double x, y; scanf ("%lf%lf", &x, &y);
    return Point (x, y);
}

double squ(double x) {
    return x * x;
}

double calc_dis(Point a, Point b) {
    return sqrt (squ (a.x - b.x) + squ (a.y - b.y));
}

int main() {
    A = read_point ();
    B = read_point ();
    O = read_point ();
    scanf ("%d", &n);
    for (int i=1; i<=n; ++i) {
        point[i] = read_point ();
        dis[i] = calc_dis (point[i], O);
        pre[i] = suff[i] = -dis[i] + calc_dis (point[i], B);
        add[i] = -dis[i] + calc_dis (point[i], A);
        sum += dis[i] * 2;
    }
    pre[0] = suff[n+1] = INF;
    for (int i=1; i<=n; ++i) {
        pre[i] = std::min (pre[i], pre[i-1]);
    }
    for (int i=n; i>=1; --i) {
        suff[i] = std::min (suff[i], suff[i+1]);
    }
    double ans = sum + suff[1];  //just B
    for (int i=1; i<=n; ++i) {
        ans = std::min (ans, sum + std::min (0.0, std::min (pre[i-1], suff[i+1])) + add[i]);
    }
    printf ("%.12f\n", ans);
    return 0;
}

二分 D - Robin Hood

题意:n个人,k次操作,每次把最大的数分1到最小的数,问k次后最大值和最小值的差

分析:二分最小值和最大值,思想是求出min(max) 刚好使得小于它的到它的操作正好是k.处理好二分的边界,因为二分时是尽量使得最小值大,最大值小.

#include <bits/stdc++.h>

typedef long long ll;
const int N = 5e5 + 5;
int a[N];
int n, k;

bool check(int val, int op) {
    ll need = 0;
    for (int i=0; i<n; ++i) {
        if (op == 1) {
            if (a[i] <= val) {
                need += val - a[i];
            } else {
                break;
            }
        } else if (op == 2 && a[i] >= val) {
            need += a[i] - val;
        }
    }
    return need <= k;
}

int main() {
    scanf ("%d%d", &n, &k);
    ll sum = 0;
    for (int i=0; i<n; ++i) {
        scanf ("%d", a+i);
        sum += a[i];
    }
    std::sort (a, a+n);
    int ansl = -1, ansr = 1e9;
    int left = a[0], right = sum / n;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (check (mid, 1)) {
            ansl = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    left = sum / n;
    if (sum % n) {
        left++;
    }
    right = a[n-1];
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (check (mid, 2)) {
            ansr = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    printf ("%d\n", ansr - ansl);
    return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/5491122.html

相关文章:

  • 工程云存储软件介绍
  • STM8操作LCD5110总结
  • 天地常在 锐气永存
  • 《系统架构师》——概述
  • 几何画板里怎样打根号符号
  • Spring-Data-JPA criteria 查询
  • 使用 Xtrabackup 在线对MySQL做主从复制
  • 静态代码块和非静态代码块的比较
  • JDK 卸载
  • 前台页面优化全攻略(二)
  • Spring Boot多数据源连接8小时后断开的问题解决(MySQL)
  • xtream 示例介绍
  • iOS逆向之五-MACH-O文件解析
  • 从零开始配置git
  • php语法
  • [NodeJS] 关于Buffer
  • 345-反转字符串中的元音字母
  • Travix是如何部署应用程序到Kubernetes上的
  • 反思总结然后整装待发
  • 微信公众号开发小记——5.python微信红包
  • 微信开源mars源码分析1—上层samples分析
  • 小程序01:wepy框架整合iview webapp UI
  • Nginx实现动静分离
  • 如何正确理解,内页权重高于首页?
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (2.2w字)前端单元测试之Jest详解篇
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (强烈推荐)移动端音视频从零到上手(上)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (万字长文)Spring的核心知识尽揽其中
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 回调、接口回调、 委托
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .Net的DataSet直接与SQL2005交互
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • /dev下添加设备节点的方法步骤(通过device_create)
  • ::
  • @AutoConfigurationPackage的使用
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]创建TabBar
  • [Android]如何调试Native memory crash issue
  • [C#7] 1.Tuples(元组)
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [C++]Leetcode17电话号码的字母组合
  • [C++]STL之map
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [CQOI 2011]动态逆序对
  • [delphi]保证程序只运行一个实例
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明