codeforces 的20道C题

A - Warrior and Archer

CodeForces - 595C

n  偶数  然后n个数字 A B 轮流取一个 A让差变小B让差变大 直到最后2 个   求的是最小剩下的差

最后剩下的 L R  相距 n/2    求一下最小的就行

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e9+7
#define MAXN  200100
#define ll __int64

int z[MAXN];

int main()
{

    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        sort(z+1,z+n+1);
        int mi=z[n/2+1]-z[1];
        for(int i=2;i<=n/2;i++)
            mi=min(mi,z[n/2+i]-z[i]);
        printf("%d\n",mi);
    }
    return 0;
}

C - Day at the Beach

CodeForces - 599C

最多能把这个区间分成多少段使得每段区间排序之后所有的还是排好序的

如果前缀的最大<= 后缀的最小  那么就能分  统计有多少个就行

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e9+7
#define MAXN  100100
#define ll __int64

int z[MAXN];
int mi[MAXN],mx[MAXN];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        mi[n]=z[n];
        for(int i=n-1;i>=1;i--)
            mi[i]=min(z[i],mi[i+1]);
        mx[1]=z[1];
        for(int i=2;i<=n;i++)
            mx[i]=max(mx[i-1],z[i]);
        int cnt=0;
        for(int i=1;i<n;i++)
        {
            if(mx[i]<=mi[i+1])
                cnt++;
        }
        printf("%d\n",cnt+1);
    }
    return 0;
}

D - The Two Routes

CodeForces - 602C

有一张n个点的图,任意两个点之间都有一条虚边或实边。现在有两个小朋友想从点1走到点n,一个小朋友只能走虚边,一个小朋友只能走实边。

现在问这两个小朋友都走到终点最少需要多少时间。如果没有合法方案输出-1。

2次spfa

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<deque>

using namespace std;

#define ll long long
#define inf  1e9+7
#define MAXN 410
#define exp 1e-4

bool z[MAXN][MAXN];
bool vis[MAXN];
int dis[MAXN];
deque<int>q1;

int spfa1(int S,int T)
{
    memset(vis,0,sizeof(vis));
    vis[S]=1;
    q1.push_front(S);
    for(int i=1;i<=T;i++)
        dis[i]=inf;
    dis[S]=0;
    while(!q1.empty())
    {
        int now=q1.front();
        q1.pop_front();
        vis[now]=0;
        for(int i=1;i<=T;i++)
        {
            if(i==now)
                continue;
            if(z[now][i]==1&&dis[i]>dis[now]+1)
            {
                dis[i]=dis[now]+1;
                if(!vis[i])
                {
                    if(!q1.empty())
                    {
                        if(dis[i]<dis[q1.front()])
                            q1.push_front(i);
                        else
                            q1.push_back(i);
                    }
                    else
                        q1.push_front(i);
                    vis[i]=1;
                }
            }
        }
    }
    if(dis[T]==inf)
        return -1;
    return dis[T];
}
int spfa2(int S,int T)
{
    memset(vis,0,sizeof(vis));
    vis[S]=1;
    q1.push_front(S);
    for(int i=1;i<=T;i++)
        dis[i]=inf;
    dis[S]=0;
    while(!q1.empty())
    {
        int now=q1.front();
        q1.pop_front();
        vis[now]=0;
        for(int i=1;i<=T;i++)
        {
            if(i==now)
                continue;
            if(z[now][i]==0&&dis[i]>dis[now]+1)
            {
                dis[i]=dis[now]+1;
                if(!vis[i])
                {
                    if(!q1.empty())
                    {
                        if(dis[i]<dis[q1.front()])
                            q1.push_front(i);
                        else
                            q1.push_back(i);
                    }
                    else
                        q1.push_front(i);
                    vis[i]=1;
                }
            }
        }
    }
    if(dis[T]==inf)
        return -1;
    return dis[T];
}

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            z[a][b]=z[b][a]=1;
        }
        int a=spfa1(1,n);
        int b=spfa2(1,n);
        if(a==-1||b==-1)
            printf("-1\n");
        else
            printf("%d\n",max(a,b));
    }
    return 0;
}

E - Alternative Thinking

CodeForces - 604C

给你一个长度为n 的二进制串  能有一次翻转操作  求  可以不连续的  0 1 0     或者  1 0 1  1  这样子间隔的串长度

11011

11111

110

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e9+7
#define MAXN  100100
#define ll __int64

char z[MAXN];

int main()
{

    int n;
    while(scanf("%d",&n)!=EOF)
    {
        scanf("%s",z);
        int f1,f2,f3;
        f1=f2=f3=0;
        int ans=1;
        int a=z[0]-‘0‘;
        for(int i=1;i<n;i++)
        {
            int b=z[i]-‘0‘;
            if(a!=b)
            {
                ans++;
                a=b;
            }
            if(i>=2&&z[i]==z[i-1]&&z[i-1]==z[i-2])
                f3=1;
            else if(i>=3&&z[i]==z[i-1]&&z[i-2]==z[i-3]&&z[i-1]!=z[i-2])
                 f2=1;
            else if(i>=1&&z[i]==z[i-1])
                f1++;
        }
        if(f3==1||f2==1)
            ans=ans+2;
        else if(f1>0)
        {
            if(f1>1)
                ans=ans+2;
            else
                ans=ans+1;
        }
        printf("%d\n",ans);
    }
    return 0;
}

F - Sorting Railway Cars

CodeForces - 606C

最长的排好的  其他的就是要重排的

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<set>
#include<map>

using namespace std;

#define ll long long
#define inf  1e9+7
#define MAXN 100010
#define exp 1e-4

int dp[MAXN];
int z[MAXN];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        for(int i=1;i<=n;i++)
        {
            dp[z[i]]=dp[z[i]-1]+1;
        }
        int mx=0;
        for(int i=1;i<=n;i++)
            mx=max(mx,dp[i]);
        printf("%d\n",n-mx);

    }
    return 0;
}

H - Harmony Analysis

CodeForces - 610C

构造

坐上=右上=左下   右下=左上取反

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<set>
#include<map>

using namespace std;

#define ll long long
#define inf  1e15+7
#define MAXN 1000010
#define exp 1e-4

bool z[1050][1050];

int main()
{
    int k;
    z[1][1]=1;
    for(int i=1;i<=9;i++)
    {
        int a=1<<(i-1);
        int b=1<<(i);
        for(int k=1;k<=a;k++)
            for(int j=a+1;j<=b;j++)
            {
                 z[a+k][j-a]=z[k][j]=z[k][j-a];
                 z[a+k][j]=!z[k][j-a];
            }
    }
    while(scanf("%d",&k)!=EOF)
    {
        int en=1<<k;
        for(int i=1;i<=en;i++)
        {
            for(int j=1;j<=en;j++)
                if(z[i][j]==1)
                    printf("+");
                else
                    printf("*");
            printf("\n");
        }
    }

    return 0;
}

J - Peter and Snow Blower

CodeForces - 614C

求圆环面积

最远的点就是最远的点

最进的点可能是直线上的点

A B  圆心 判断A  B  是否为钝角 余弦定理  钝角高就不再三角形里面 取近的点  否则就是 那么算高就行

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e16+7
#define MAXN  100010
#define ll __int64

double pi=4*atan(1.0);

struct point
{
    double x,y;
}z[MAXN];
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

int main()
{

    int n;
    double x1,y1;
    while(scanf("%d%lf%lf",&n,&x1,&y1)!=EOF)
    {
        for(int i=0;i<n;i++)
            scanf("%lf%lf",&z[i].x,&z[i].y);
        double mi,mx;
        mx=0;
        mi=inf;
        for(int i=0;i<n;i++)
        {
            mx=max(mx,dis(x1,y1,z[i].x,z[i].y)*dis(x1,y1,z[i].x,z[i].y));
            double a,b,c;
            a=dis(z[(i+1)%n].x,z[(i+1)%n].y,x1,y1);
            b=dis(z[i].x,z[i].y,z[(i+1)%n].x,z[(i+1)%n].y);
            c=dis(z[i].x,z[i].y,x1,y1);
            //printf("%lf %lf %lf \n",a,b,c);
            if(b*b+c*c-a*a<0||a*a+b*b-c*c<0)
            {
                mi=min(mi,a*a);
                mi=min(mi,c*c);
            }
            else
            {
                double l=(a+b+c)/2;
                double s=sqrt(l*(l-a)*(l-b)*(l-c));
                double x=s*2/b;
                mi=min(mi,x*x);
            }
        }

        printf("%.8lf\n",(mx-mi)*pi);
    }
    return 0;
}

K - Watering Flowers

CodeForces - 617C

列举这个点在r1那么 >d  就是在 r2

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e16+7
#define MAXN  2010
#define ll __int64

struct point
{
    ll x,y;
}z[MAXN];
ll dis(ll x1,ll y1,ll x2,ll y2)
{
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main()
{
    int n;
    ll x1,y1,x2,y2;
    while(scanf("%d%I64d%I64d%I64d%I64d",&n,&x1,&y1,&x2,&y2)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%I64d%I64d",&z[i].x,&z[i].y);
        ll mx=0;
        ll r1,r2;
        r1=r2=0;
        for(int i=1;i<=n;i++)
            r2=max(r2,dis(x2,y2,z[i].x,z[i].y));
        mx=inf;
        mx=min(mx,r2);
        for(int i=1;i<=n;i++)
            r1=max(r1,dis(x1,y1,z[i].x,z[i].y));
        mx=min(mx,r1);
        for(int i=1;i<=n;i++)
        {
            r1=dis(x1,y1,z[i].x,z[i].y);
            r2=0;
            for(int j=1;j<=n;j++)
            {
                if(j==i)
                    continue;
                if(dis(x1,y1,z[j].x,z[j].y)>r1)
                    r2=max(r2,dis(x2,y2,z[j].x,z[j].y));
            }
            mx=min(mx,r1+r2);
        }
        printf("%I64d\n",mx);
    }

    return 0;
}

M - K-special Tables

CodeForces - 625C

看看例子就知道小的先在左边那几列填上去

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e16+7
#define MAXN  510
#define ll __int64

int z[MAXN][MAXN];

int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        int sum;
        sum=0;
        int b=k-1;
        int c=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=b;j++)
                z[i][j]=c++;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=k;j<=n;j++)
                z[i][j]=c++;
        }
        for(int i=1;i<=n;i++)
            sum=sum+z[i][k];
        printf("%d\n",sum);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<n;j++)
                printf("%d ",z[i][j]);
            printf("%d\n",z[i][n]);
        }
    }
    return 0;
}

N - Famil Door and Brackets

 CodeForces - 629C 长度为i  ( 比 ) 多 j个 的数目dp[i][j]=(dp[i-1][j-1]+dp[i-1][j+1])列举一下左边的长度 

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1000000007
#define MAXN  100100
#define ll __int64

char z[MAXN];
ll dp[2010][2010];

int main()
{

    int n,m;
    dp[0][0]=1;
    for(int i=1;i<=2000;i++)
    {
        dp[i][0]=dp[i-1][1];
        for(int j=1;j<=i;j++)
        {
            dp[i][j]=(dp[i-1][j-1]+dp[i-1][j+1])%inf;
        }
    }
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        scanf("%s",z);
        int pr=-inf;
        int sum=0;
        for(int i=0;i<m;i++)
        {
            if(z[i]==‘)‘)
                sum++;
            else
                sum--;
            pr=max(pr,sum);
        }
        sum=0;
        for(int i=m-1;i>=0;i--)
        {
            if(z[i]==‘(‘)
                sum++;
            else
                sum--;
        }
        ll ans=0;
        for(int i=0;i<=n-m;i++)
        {
            for(int j=0;j<=n-m;j++)
            {
                int k=j+sum;
                if(j>=pr&&k<=n-m)
                {
                    ans=(ans+(dp[i][j]*dp[n-m-i][k])%inf)%inf;
                }
            }
        }

        printf("%I64d\n",ans);
    }
    return 0;
}

O - Report

CodeForces - 631C

给你一个初始的序列a[1],a[2],...,a[n] ,请输出经过m次操作后的序列。

每个操作是以下两种之一:

1 r,将子序列a[1]~a[r] 从小到大排序

2 r,将子序列a[1]~a[r] 从大到小排序

找到最长的  因为前面的短的没用  然后找到下一个长的 这个的贡献就是后面那几个排好  

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>

using namespace std;

#define inf 1e9+7
#define MAXN  200100
#define ll __int64

int z[MAXN];
int b[MAXN];

struct node
{
    int ty,ind;
}mx[MAXN];

int main()
{

    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
              scanf("%d",&z[i]);
              b[i]=z[i];
        }
        int len=1;
        mx[0].ind=0;
        for(int i=1;i<=m;i++)
        {
            int ty,r;
            scanf("%d%d",&ty,&r);
            while(len>=1&&r>=mx[len-1].ind)
                len--;
            mx[len].ty=ty;
            mx[len].ind=r;
            len++;
        }
        mx[len].ind=0;
        len++;
        sort(b+1,b+mx[0].ind+1);
        int l,r;
        l=1;
        r=mx[0].ind;
        for(int i=0;i<len-1;i++)
        {
            int aa=mx[i].ind;
            int bb=mx[i+1].ind;
            if(mx[i].ty==1)
            {
                for(int j=aa;j>bb;j--)
                    z[j]=b[r--];
            }
            else
            {
              //  printf("%d %d\n",bb,aa);
                for(int j=aa;j>bb;j--)
                    z[j]=b[l++];
            }
        }

        for(int i=1;i<n;i++)
            printf("%d ",z[i]);
        printf("%d\n",z[n]);
    }
    return 0;
}

P - Watchmen

CodeForces - 651C

x要相同 或者y 相同

x y 相同要去同

#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#include<stack>
#include<deque>
#include<math.h>
#include<set>
#include<iterator>

using namespace std;

#define inf 1e9+7
#define MAXN  10100
#define ll __int64
typedef pair<int, int> p;
map<int,int>x,y;
map<p,int>m1;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        x.clear();
        y.clear();
        m1.clear();
        for(int i=1;i<=n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            x[a]++;
            y[b]++;
            m1[p(a,b)]++;
        }
        ll ans=0;
        for(map<int,int>::iterator i=x.begin();i!=x.end();i++)
            ans=ans+(ll)i->second*(i->second-1)/2;
        for(map<int,int>::iterator i=y.begin();i!=y.end();i++)
            ans=ans+(ll)i->second*(i->second-1)/2;
        for(map<p,int>::iterator i=m1.begin();i!=m1.end();i++)
            ans=ans-(ll)i->second*(i->second-1)/2;
        printf("%I64d\n",ans);
    }
    return 0;
}

Q - International Olympiad

CodeForces - 664C

题意是 给出缩写 还原原来是数字

1989开始 走  后面有规律

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  100100
#define ll __int64

set<ll>s1;
char s[20];
ll ten[15];

int main()
{
    int n;
    ten[0]=1;
    for(int i=1;i<=15;i++)
        ten[i]=ten[i-1]*10;
    while(scanf("%d",&n)!=EOF)
    {
        s1.clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s);
            int len=strlen(s);
            int a=0;
            for(int j=4;j<len;j++)
                a=a*10+s[j]-‘0‘;
            int len1=len-4;
            if(len1==1)
            {
                if(a==9)
                    printf("1989\n");
                else
                    printf("199%d\n",a);
            }
            else if(len1==2)
            {
                if(a==99)
                    printf("1999\n");
                else
                    printf("20%02d\n",a);
            }
            else if(len1==3)
            {
                if(a<=98)
                    printf("3%03d\n",a);
                else
                    printf("2%03d\n",a);
            }
            else if(len1==4)
            {
                if(a<=3098)
                    printf("1%04d\n",a);
                else
                    printf("%d\n",a);
            }
            else if(len1==5)
            {
                if(a<=13098)
                    printf("1%05d\n",a);
                else
                    printf("%d\n",a);
            }
            else if(len1==6)
            {
                if(a<=113098)
                    printf("1%06d\n",a);
                else
                    printf("%d\n",a);
            }
            else if(len1==7)
            {
                if(a<=1113098)
                    printf("1%07d\n",a);
                else
                    printf("%d\n",a);
            }
            else if(len1==8)
            {
                if(a<=11113098)
                    printf("1%08d\n",a);
                else
                    printf("%d\n",a);
            }
            else if(len1==9)
            {
                if(a<=111113098)
                    printf("1%09d\n",a);
                else
                    printf("%d\n",a);
            }

        }
    }
    return 0;
}

R - Little Artem and Matrix

CodeForces - 669C

反一下过来就行了

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  10100
#define ll __int64

struct node
{
    int ty,a,b,c;
}z[MAXN];
int x[110][110];

int main()
{
    int n,m,q;
    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        memset(x,0,sizeof(x));
        for(int i=1;i<=q;i++)
        {
            scanf("%d",&z[i].ty);
            if(z[i].ty==3)
                scanf("%d%d%d",&z[i].a,&z[i].b,&z[i].c);
            else
                scanf("%d",&z[i].a);
        }
        for(int i=q;i>=1;i--)
        {
            if(z[i].ty==3)
                x[z[i].a][z[i].b]=z[i].c;
            else
            {
                if(z[i].ty==1)
                {
                    int a=x[z[i].a][m];
                    for(int j=m;j>1;j--)
                        x[z[i].a][j]=x[z[i].a][j-1];
                    x[z[i].a][1]=a;
                }
                else
                {
                    int a=x[n][z[i].a];
                    for(int j=n;j>1;j--)
                        x[j][z[i].a]=x[j-1][z[i].a];
                    x[1][z[i].a]=a;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<m;j++)
                printf("%d ",x[i][j]);
            printf("%d\n",x[i][m]);
        }
    }
    return 0;
}

S - Reberland Linguistics

CodeForces - 667C

前面至少有5个 后面有两个或者三个字母  而且不能相同 有多少个 这样子的2个的或者三个的   、

dp[i][j]  代表 i  到 i+j 能不能成功

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  10100
#define ll __int64

set<string>s1;
bool dp[MAXN][4];

int main()
{
    string s ;
    while(cin>>s)
    {
        memset(dp,0,sizeof(dp));
        s1.clear();
        int len=s.length();
        dp[len][3]=dp[len][2]=1;
        for(int i=len-2;i>=5;i--)
        {
            if(dp[i+2][3]||dp[i+2][2]&&s.substr(i,2)!=s.substr(i+2,2))
            {
                s1.insert(s.substr(i,2));
                dp[i][2]=1;
            }
            if(dp[i+3][2]||dp[i+3][3]&&s.substr(i,3)!=s.substr(i+3,3))
            {
                s1.insert(s.substr(i,3));
                dp[i][3]=1;
            }
        }
        printf("%d\n",s1.size());
        for(set<string>::iterator i=s1.begin();i!=s1.end();i++)
            cout<<*i<<endl;
    }
    return 0;
}

T - Bear and Colors

CodeForces - 673C

n*n  能过

#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#include<stack>
#include<deque>
#include<math.h>

using namespace std;

#define inf 1e9+7
#define MAXN  10100
#define ll __int64

int ans[MAXN];
int z[MAXN];
int now[MAXN];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=n;i++)
        {
            memset(now,0,sizeof(now));
            int mx=5001,cnt=0;

            for(int j=i;j<=n;j++)
            {
                now[z[j]]++;
                if(now[z[j]]>cnt)
                {
                    mx=z[j];
                    cnt=now[z[j]];
                }
                else if(now[z[j]]==cnt)
                {
                    mx=min(mx,z[j]);
                }
                ans[mx]++;
            }
        }
        for(int i=1;i<n;i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[n]);
    }

    return 0;
}

U - Recycling Bottles

CodeForces - 672C

维护A到 瓶子距离 B   垃圾站

然后 A -> 瓶子  ->垃圾站   B  ->瓶子 ->垃圾站

2个最小距离

为什么是2个  A B可能是同一个

特例是只有A去捡或者B去

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  100100
#define ll __int64

struct node
{
    double x,y;

}z[MAXN];

double da[MAXN],db[MAXN],dc[MAXN];

double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

int main()
{
    double xa,ya,xb,yb,xc,yc;
    while(scanf("%lf%lf%lf%lf%lf%lf",&xa,&ya,&xb,&yb,&xc,&yc)!=EOF)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&z[i].x,&z[i].y);
        int aind1,aind2,bind1,bind2;
        bind1=bind2=aind1=aind2=0;
        double ans=0;
        da[0]=inf;
        db[0]=inf;
        dc[0]=-inf;
        for(int i=1;i<=n;i++)
        {
            da[i]=dis(xa,ya,z[i].x,z[i].y);
            db[i]=dis(xb,yb,z[i].x,z[i].y);
            dc[i]=dis(xc,yc,z[i].x,z[i].y);
            if(da[i]-dc[i]<=da[aind1]-dc[aind1])
            {
                aind2=aind1;
                aind1=i;
            }
            else if(da[i]-dc[i]<da[aind2]-dc[aind2])
            {
                aind2=i;
            }

            if(db[i]-dc[i]<=db[bind1]-dc[bind1])
            {
                bind2=bind1;
                bind1=i;
            }
            else if(db[i]-dc[i]<db[bind2]-dc[bind2])
            {
                bind2=i;
            }
        }
        if(aind1!=bind1)
        {
            for(int i=1;i<=n;i++)
            {
                if(i==aind1)
                {
                    ans=ans+da[i]+dc[i];
                }
                else if(i==bind1)
                {
                    ans=ans+db[i]+dc[i];
                }
                else
                    ans=ans+2*dc[i];
            }
        }
        else
        {
            double ans1=0;
            for(int i=1;i<=n;i++)
            {
                if(i==aind1)
                {
                    ans1=ans1+da[i]+dc[i];
                }
                else if(i==bind2)
                {
                    ans1=ans1+db[i]+dc[i];
                }
                else
                    ans1=ans1+2*dc[i];
            }
            ans=ans1;
            ans1=0;
            for(int i=1;i<=n;i++)
            {
                if(i==aind2)
                {
                    ans1=ans1+da[i]+dc[i];
                }
                else if(i==bind1)
                {
                    ans1=ans1+db[i]+dc[i];
                }
                else
                    ans1=ans1+2*dc[i];
            }
            ans=min(ans,ans1);
        }
        double ans1=0;
        for(int i=1;i<=n;i++)
        {
            if(i==aind1)
                ans1=ans1+da[i]+dc[i];
            else
                ans1=ans1+dc[i]*2;
        }
        ans=min(ans,ans1);
        ans1=0;
        for(int i=1;i<=n;i++)
        {
            if(i==bind1)
                ans1=ans1+db[i]+dc[i];
            else
                ans1=ans1+dc[i]*2;
        }
        ans=min(ans,ans1);
        //printf("%d %d %d %d\n",aind1,aind2,bind1,bind2);
        printf("%.7lf\n",ans);
    }
    return 0;
}

V - Money Transfers

CodeForces - 675C

前缀和相同 那么可以少移动一次

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  100100
#define ll __int64

int z[MAXN];
map<ll,int>m1;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        m1.clear();
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        int ans=0;
        ll sum=0;
        for(int i=1;i<=n;i++)
        {
            sum=sum+z[i];
            m1[sum]++;
            if(m1[sum]>ans)
                ans=m1[sum];
        }
        printf("%d\n",n-ans);
    }
    return 0;
}

W - Vasya and String

CodeForces - 676C

小希有一个长度为n的ab串,他想要找出最长的一个子串使得这个子串中每个字符都相等,他称之为“最优子串”。当然对小希来说这个问题太简单了,于是他加了一个条件:他可以改变这个串中的某些字符,但一次只能改变一个字符,最多能改变k次。小希想要知道,在可以对串进行改变的前提下,这个ab串的“最优子串”的长度是多少。

列举位置 二分最右边的位子  前缀和

#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#include<stack>
#include<deque>
#include<math.h>
#include<set>
#include<iterator>

using namespace std;

#define inf 1e9+7
#define MAXN  100100
#define ll __int64

char z[MAXN];
int  a[MAXN],b[MAXN];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        scanf("%s",z+1);
        int len=n;
        for(int i=1;i<=len;i++)
        {
            if(z[i]==‘a‘)
            {
                a[i]=a[i-1]+1;
                b[i]=b[i-1];
            }
            else
            {
                a[i]=a[i-1];
                b[i]=b[i-1]+1;
            }
        }
        int mx=0;
        for(int i=1;i<=len;i++)
        {
            int l,r;
            l=i;
            r=len;
            int mx1=l;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if((mid-i+1)-(a[mid]-a[i-1])>m)
                    r=mid-1;
                else
                {
                    mx1=max(mx1,mid);
                    l=mid+1;
                }
            }
            mx=max(mx,mx1-i+1);
            l=i;
            r=len;
            mx1=l;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if((mid-i+1)-(b[mid]-b[i-1])>m)
                    r=mid-1;
                else
                {
                    mx1=max(mx1,mid);
                    l=mid+1;
                }
            }
             mx=max(mx,mx1-i+1);
        }
        printf("%d\n",mx);
    }
    return 0;
}

X - Vanya and Label

CodeForces - 677C

3^(0的数目)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  100100
#define ll __int64

char z[MAXN];

int deal(char a)
{
    int w;
    if(a>=‘0‘&&a<=‘9‘)
        w=a-‘0‘;
    else if(a>=‘A‘&&a<=‘Z‘)
        w=a-‘A‘+10;
    else if(a>=‘a‘&&a<=‘z‘)
        w=a-‘a‘+36;
    else if(a==‘_‘)
        w=63;
    else
        w=62;
    int num=0;
    for(int i=1;i<=6;i++)
    {
        if(w%2==0)
            num++;
        w>>=1;
    }
    return num;

}
int main()
{
    while(scanf("%s",z)!=EOF)
    {
        int len=strlen(z);
        ll ans=1;
        for(int i=0;i<len;i++)
        {
            int a=deal(z[i]);
            for(int i=1;i<=a;i++)
                ans=(ans*3)%inf;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

 
时间: 2024-10-26 03:21:00

codeforces 的20道C题的相关文章

Educational Codeforces Round 20解(bu)题记录

A. Maximal Binary Matrix 解法:暴力模拟+贪心 #include<bits/stdc++.h> using namespace std; int a[110][110]; int main(){ int n,k,cmp,f=0;scanf("%d%d",&n,&k); if(k>n*n){puts("-1");return 0;}cmp=n; int r=1; while(k>=2*cmp-1){ k-

关于SQL的几道小题详解

关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样的惯性思维其实早在我们度高中的时候就被领教了,所谓“万变不离其宗”吧.以下各题来自日常所见,或QQ群,或面试题,或博客园. 题目一:如下表所示,现需要按照收款员统计收款和退款合计金额. 实现结果需如下显示: 分析:想要的结果(记为表B)和源数据(记为表A)相比,有共同的列(收款员),不同的是表A的金

逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)

闲来无事,逛园子,充充电.发现了一个挺有意思的博文,自己玩了一把. 第一题:使用 HTML+CSS 实现如图布局,border-widht 1px,一个格子大小是 60*60,hover时候边框变为橘红色(兼容IE6+,考虑语义化的结构) 效果图: 简单分析一下: 使用伪类 :hover的时候相对定位 改变z-index, 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta c

各位大佬Python的第一部分道基础题已经整理好了,希望大家面试的时候能用的上。

Python的第一部分道基础题,希望大家面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之一. 2.通过什么途径学习的Python? 通过自学,包括网上查看一些视频,购买一些相关专业的书籍. 3.Python和Java.PHP.C.C#.C++等其他语言相比? Python:轻量级.易学.自由/开放源码软件.可移植性.支持面向对象.丰富的库.规范的代码. Java:优点:开源性,功能强大,库多 缺点:编译速

20 考研英语题源外刊精讲赏析 1~10 期外刊原文+翻译+点评

打卡日期记录: ===========遗忘曲线记录====查词用浏览器:复习刷遍数,用电子版文件m====== 20 考研英语题源外刊精讲赏析1~10 期外刊原文+翻译+点评 01-<美国执业证照制度在阻碍竞争> 本文选自 The Economist<经济学人> 2018 年 2 月 17 日一篇题为 America should get rid ofoppressive job licensing(职业证照制度在阻碍竞争)的文章. 作者指出,美国的职业证照制度并不能保护消费者利益

大数--几道水题,用来学学JAVA

几道水题,练习一下JAVA写大数 poj2305  Basic remains 大数可以直接用非十进制读入,读入的数在变量中是十进制的 输出的时候要先用BigInteger的toString方法转换为相应的进制 1 import java.math.*; 2 import java.util.*; 3 class Main 4 { 5 public static void main(String[] args) 6 { 7 Scanner cin = new Scanner(System.in)

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

Codeforces 48C The Race 模拟题

题目链接:点击打开链接 题意: 给定n个加油站,一辆车由A点跑到B点,每个100m有一个加油站,每开100m需要10升油. 在每个车站会检查一下油量,若车子若开不到下一个加油站则加x升油. 开始有x升油 下面给出加油的记录. 问下一次加油在哪一站.若答案唯一输出具体哪站. 油箱容量无限 思路: 水模拟.. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>

几道随机化题

随机大法好,乱搞出奇迹. pro:给一个n*m的网格,每个格子上有一种颜色或障碍,求最小的不含障碍的联通块包含至少k个颜色. n,m<=100 color<=n*m k<=5 sol:对于color比较小的情况,比如color=k,就是一个裸的斯坦纳树.然后我们每次将所有颜色随机分到k个盒子里,一个盒子都染成相同颜色,然后按上述方法做,取最小值.每次做解是可行的,是最优解的情况是刚好随机到最后答案的颜色在不同盒子里,大概就是k!/(k^k). pro:给一张无向联通图,问删去两条边使图不