• Codeforces Round #352 (Div. 2) (A-D)


    672A Summer Camp

    题意:

    1-n数字连成一个字符串, 给定n , 输出字符串的第n个字符。n 很小, 可以直接暴力。
    

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int begin = 1;
        for(;;)
        {
            int dig = log10(begin) + 1;
            if(n <= dig) 
            {
                char ss[10];
                sprintf(ss, "%d", begin);
                cout << ss[n-1] << endl; 
                break;
            }
            else {
                begin ++;
                n -= dig;
            }
        }
        return 0;
    }
    

    672B Different is Good

    题意:

    给定一个字符串, 可以对字符串进行单个字符的修改, **要求所有子串都不相同**
    所以每个字符都不能相同。
    

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    int Sum[50];
    int main() {
        memset(Sum, 0, sizeof(Sum));
        int n;
        string s;
        cin >> n >> s;
        int Count = 0;
        int Vis = 0;
        for(int i = 0; i < s.length(); ++i)
        {
            int c = s[i]-'a';
            Sum[c]++; 
        }
        for(int i = 0; i < 26; ++i)
        {
            if(Sum[i]) Vis++;
            if(Sum[i] > 1) Count += Sum[i] - 1;
        }
        int ANS = 0;
        if(Count > (26 - Vis)) ANS = -1;
        else ANS = Count;
        cout << ANS << endl;
    }
    

    671A Recycling Bottles

    题意:

    有A , B两人, 垃圾桶T点, 坐标系中还有 n 个垃圾桶。
    A,B两人去捡垃圾, 把垃圾放入垃圾桶中, 一次一个, 输出A,B两人的最短行走路线。
    (A,B)并不是都要去捡, 可以只有一个人。
    直接进行贪心就可以得出结果了。
    

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    const double eps = 1e-8;
    typedef long long LL;
    const int maxn = 1e5 + 131;
    struct Point {
        LL x, y;
    } ;
    Point A, B, T;
    Point Num[maxn];
    int n;
    
    double Distance(Point a, Point b) {
        return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
    }
    
    double Dis_T[maxn], Dis_A[maxn], Dis_B[maxn];
    double GetIn() {
        double Sum = 0.0;
        cin >> A.x >> A.y >> B.x >> B.y >> T.x >> T.y;
        cin >> n;
        for(int i = 0; i < n; ++i)
        {
            cin >> Num[i].x >> Num[i].y;
            Dis_T[i] = Distance(Num[i], T);
            Dis_A[i] = Distance(Num[i], A);
            Dis_B[i] = Distance(Num[i], B);
            Sum += (Dis_T[i] * 2);
        }
        //总距离是在 2倍Dis_T 的基础上修改的。
        return Sum;
    }
    
    int main() {
        double S ,Sum;
        S = Sum = GetIn();
        double MinA = 1e12, MinB = 1e12;
        int posA = 0, posB = 0;
        for(int i = 0; i < n; ++i)
        {
            if(Dis_A[i]-Dis_T[i] < MinA) // 找出 A 点最短的第一次捡垃圾路线
            {
                MinA = Dis_A[i]-Dis_T[i];
                posA = i;
            }
            if(Dis_B[i]-Dis_T[i] < MinB) // 同理 B 点。
            {
                MinB = Dis_B[i]-Dis_T[i];
                posB = i;
            }
        }
        if(MinA < 0 && MinB < 0) { // 小于 0 则说明 Dis_A + Dis_T <2 * Dis_T 的;
            if(posA == posB) {
                S = min(S, Sum-Dis_T[posA]+Dis_A[posA]); //只有A 捡垃圾的情况
                S = min(S, Sum-Dis_T[posB]+Dis_B[posB]); //只有B 捡垃圾的情况
                for(int i = 0; i < n; ++i) if(i != posA)
                    S = min(S, Sum-Dis_T[posA]+Dis_A[posA]-Dis_T[i]+Dis_B[i]);
                for(int i = 0; i < n; ++i) if(i != posB)
                    S = min(S, Sum-Dis_T[posB]+Dis_B[posB]-Dis_T[i]+Dis_A[i]);
            }
            else {
                S = Sum + MinA + MinB;
            }
        }
        else {
            if(MinA < MinB)
                S = Sum - Dis_T[posA]+Dis_A[posA];
            else
                S = Sum - Dis_T[posB]+Dis_B[posB];
        }
        printf("%.12f
    ",S);
        return 0;
    }
    

    671B Robin Hood

    题意:

    给一组序列, 有一个人, 每天会把序列的最大值 -1, 最小值 +1;
    如果序列都相同, 不做任何动作。
    输出 K 天后 序列的 Max - Min;
    也是贪心。
    

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long LL;
    const int maxn = 5000000 + 131;
    LL City[maxn];
    LL n, k;
    int main() {
        std::ios::sync_with_stdio(false);
        cin >> n >> k;
        LL Sum = 0;
        for(int i = 0; i < n; ++i) cin >> City[i], Sum += City[i];
        sort(City, City+n);
        LL Min = City[0], Max = City[n-1];
        LL Use = k;
        for(int i = 1; i < n; ++i) if(City[i] > Min) { //先把小的值一起抬高
            LL temp = min(City[i]-Min, Use/LL(i));
            Min += temp;
            Use -= temp * i;//总共消耗的天数。
            /* 这里Use 有余下, 也不会对 Max - Min 造成影响,*/
        }
        Use = k;
        for(int i = n-2; i >= 0; --i) if(City[i] < Max) {
            LL temp = min(Max-City[i], Use/LL(n-i-1));
            Max -= temp;
            Use -= temp * (n-i-1);
        }
    
        LL Ans = Sum % n ? 1 : 0;
        Ans = max(Ans, Max - Min);
        cout << Ans <<endl;
        return 0;
    }
    

    E 题

  • 相关阅读:
    jq使用手册
    MVC4 Forms 验证,部署到Hyper-v上.FormsAuthentication.SetAuthCookie无效的问题
    ASP.NET FormsAuthentication跨站点登录时绝对地址返回的问题
    FireBird.conf 常用参数说明 (FrieBird3.0.4版)
    AnkhSVN2019
    控制台程序的RedirectStandardOutput
    代替webbrowser的插件:CefSharp
    mssql分区视图
    Firebird写存储过程
    .net项目多个目标架构
  • 原文地址:https://www.cnblogs.com/aoxuets/p/5506830.html
Copyright © 2020-2023  润新知