Codeforces Round #409(Div.2)
阅读原文时间:2023年07月09日阅读:1

传送门

题意

A.询问最多改变一个字符的字符串“VK”子串数量

B.f(x,z)=y,给出x,y,求z

For example, f("ab", "ba") = "aa", and f("nzwzl", "zizez") = "niwel".

C.一个充电器充电\(p/min\),n台机器消耗电\(a_i/min\),一开始每台机器拥有电\(b_i\),问最多能使所有机器运行时间(一台机器停止则停止计时)

D.给出一个n角凸多边形,问每个点最多能移动多少距离保持多边形的凸性

分析

A.模拟

B.模拟

C.

如果可以用x秒,显然小于x秒时也可使用。故考虑二分时间。

得到了时间,我们就可以算出p的贡献为p_t。

然后遍历每台机器,若cost[i]_t > stored[i], 说明这台机器需要分配资源。

所有机器分配完之后的总资源还大于等于0则说明可以运行到t。

需要注意的是,这题eps = -4, 二分上界为1e11才过= =..二分浮点还是老老实实for个百遍

D.

考虑顶点i,若移动此点,则(i-1+n)%n, (i+1)%n也得动。

极限情况下这三点构成的三角形会退化成直线。

由于退化后这个三角形的周长其实是均摊到原图的,原图的周长不变,所以在纸上画一画发现其实就是原三角形把高一半处上方的三角形用高截成了两半,然后分到两边填充。

所以只需要算出这个高,答案就是所有高中最短的/2。

至于高的计算可以通过余弦定理算出cos,得到sin然后算出面积,除以底得到。或者用海伦公式

trick

代码

只给出C,D代码

C.

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define mem(a,b) memset(a,b,sizeof(a))

int n;
double t,l,r,p;
struct node
{
    double a,b,value;
    bool operator<(const node &p)const
    {
        return value<p.value;
    }
}c[100100];
double v[100100];
int main()
{
    scanf("%d %lf",&n,&p);
    for(int i=1;i<=n;++i)
    {
        scanf("%lf %lf",&c[i].a,&c[i].b);
        c[i].value=c[i].b/c[i].a;
    }
    sort(c+1,c+1+n);
    //for(int i=1;i<=n;++i) printf("%f %f\n",c[i].a,c[i].b);
    for(int i=1;i<=n;++i) v[i]=c[i].value;
    l=0,r=1e15;
    for(int i=1;i<=1000;++i)
    {
        double mid=(l+r)/2,suma=0,sumb=0;
        bool flag=1;
        int loc=lower_bound(v+1,v+1+n,mid)-v;
        //printf("loc=%d ",loc);
        for(int j=1;j<loc;++j)
        {
            suma+=c[j].a;sumb+=c[j].b;
            if((p*mid+sumb)<suma*mid) { flag=0;break; }
        }
        //printf("%d\n",flag);
        //if(flag==1) printf("%f %f %f\n",p*mid+sumb,suma*mid,mid);
        if(flag) l=mid;else r=mid;
    }
    if(l==1e15) { puts("-1");return 0; }
    printf("%f\n",(l+r)/2);
}

D.

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)    for (int i(a); i <= (b); ++i)
#define dec(i, a, b)    for (int i(a); i >= (b); --i)

double x[100010], y[100010];
int n;

int main(){

    scanf("%d", &n);

    rep(i, 1, n){
        scanf("%lf%lf", x + i, y + i);
    }

    x[++n] = x[1], y[n] = y[1];
    x[++n] = x[2], y[n] = y[2];
    x[++n] = x[3], y[n] = y[3];

    double ans = 1e9;

    rep(i, 1, n - 2){
        double cnt = fabs((x[i + 1] - x[i]) * (y[i + 2] - y[i]) - (x[i + 2] - x[i]) * (y[i + 1] - y[i])) / 2;
        double et = cnt / sqrt((x[i] - x[i + 2]) * (x[i] - x[i + 2]) + (y[i] - y[i + 2]) * (y[i] - y[i + 2]));
        ans = min(ans, et);
    }

    printf("%.9f\n", ans);
    return 0;
}