Codeforces Round #352 (Div. 2)

A题有点水,但是花了10分钟才a掉,把%10的先加一,处理成字符串再减一

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=5000+10,maxn=1000000+10,inf=0x3f3f3f;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s="";
    for(int i=1;i<1000;i++)
    {
        string t="";
        int p=i;
        if(p%10==0)p+=1;
        while(p)
        {
            t+=(char)(p%10+'0');
            p/=10;
        }
        reverse(t.begin(),t.end());
        if(i%10==0)t[t.size()-1]='0';
        s+=t;
    }

    int n;
    cin>>n;
    cout<<s[n-1]<<endl;
    return 0;
}
/********************

********************/
A

B题长度大于26就不行,其他的就全处理成不同字符就行了

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=5000+10,maxn=1000000+10,inf=0x3f3f3f;

bool vis[30];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    int n;
    cin>>n>>s;
    if(s.size()>26)cout<<-1<<endl;
    else
    {
        memset(vis,0,sizeof vis);
        int ans=0;
        for(int i=0;i<s.size();i++)
            if(!vis[s[i]-'a'])
            {
                ans++;
                vis[s[i]-'a']=1;
            }
        cout<<s.size()-ans<<endl;
    }
    return 0;
}
/********************

********************/
B

C题,一开始的思路是对的,但是没有考虑到只有一个人捡垃圾的情况,就是找最大的能节省的路程(垃圾桶到垃圾的距离-人到垃圾桶的距离)(分别枚举一下a,b)

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f;

double x[N],y[N];
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout<<setiosflags(ios::fixed)<<setprecision(12);
    double ax,ay,bx,by,tx,ty;
    cin>>ax>>ay>>bx>>by>>tx>>ty;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
    if(n==1)
    {
        double ans=min(dis(x[1],y[1],ax,ay),dis(x[1],y[1],bx,by));
        cout<<ans+dis(x[1],y[1],tx,ty)<<endl;
        return 0;
    }
    double max1=-2e9,max2=-2e9;
    int id1=0,id2=0;
    for(int i=1;i<=n;i++)
    {
        double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],ax,ay);
        if(te>max1)
        {
            max1=te;
            id1=i;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(i==id1)continue;
        double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],bx,by);
        if(te>max2)
        {
            max2=te;
            id2=i;
        }
    }
    double p=max(max1+max2,max(max1,max2));
    max1=max2=-2e9;
    id1=id2=0;
    for(int i=1;i<=n;i++)
    {
        double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],bx,by);
        if(te>max1)
        {
            max1=te;
            id1=i;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(i==id1)continue;
        double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],ax,ay);
        if(te>max2)
        {
            max2=te;
            id2=i;
        }
    }
    p=max(p,max(max1+max2,max(max1,max2)));
    double ans=0;
    for(int i=1;i<=n;i++)ans+=2*dis(x[i],y[i],tx,ty);
    cout<<ans-p<<endl;
    return 0;
}
/********************
1
********************/
C

D题,思路完全不对啊,想去二分差值,但是处理太麻烦了,正解是二分完成后的最大值,最小值

注意处理上下界的问题,先求平均数,如果平均数是整数,那么上下界都是它,否则,下界应该是平均数+1

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=500000+10,maxn=500+100,inf=0x3f3f3f;

ll c[N],n,k,te[N];
bool ok1(ll x)
{
    ll ans=0;
    for(int i=1;i<=n;i++)
        if(c[i]<x)
           ans+=x-c[i];
    return ans<=k;
}
bool ok2(ll x)
{
    ll ans=0;
    for(int i=1;i<=n;i++)
        if(c[i]>x)
           ans+=c[i]-x;
    return ans<=k;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>k;
    ll sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>c[i];
        sum+=c[i];
    }
    ll R,L;
    if(sum%n==0)L=R=sum/n;
    else L=sum/n,R=sum/n+1;
    sort(c+1,c+1+n);
    ll l=0,r=L+1;
    while(l<r-1)
    {
        ll m=(l+r)/2;
        if(ok1(m))l=m;
        else r=m;
    }
    ll ans1=l;
    l=R-1,r=1e9;
    while(l<r-1)
    {
        ll m=(l+r)/2;
        if(ok2(m))r=m;
        else l=m;
    }
    cout<<r-ans1<<endl;
    return 0;
}
/*********************

*********************/
D
原文地址:https://www.cnblogs.com/acjiumeng/p/7381231.html