cf#403 A B C

来源:互联网 发布:查看ip端口是否打开 编辑:程序博客网 时间:2024/05/16 19:31

A (模拟)

Andryusha要收n对袜子,他会一只袜子一只袜子的拿出来放在桌子上,只要一有成对的就收回衣柜,求桌子上最多可以同时存在多少种袜子。

一道很简单的模拟水题,标记一下袜子的数量即可。因为粗心,所以习惯性的从1枚举到n,但是是要枚举到2*n,所以wa了一发

#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;const int maxn=1e5+10;int a[maxn],vis[maxn];int main(){    int n;    scanf("%d",&n);        int s;    int maxx=0;    int cnt=0;    for(int i=0;i<n*2;i++)    {        scanf("%d",&s);        if(vis[s]==0)            cnt++;        if(maxx<cnt)            maxx=cnt;        vis[s]++;        if(vis[s]==2)            cnt--;    }    printf("%d",maxx);    return 0;}



B(二分)

有n个人,分别给出这个n个人的位置和时间,求这些人可以聚集在一起的最短时间,可以相向而行;

刚开始xjb模拟一直wa7和8,后来dalao指点说二分答案,对时间进行二分。


#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>#include <cmath>#define eps 1e-7using namespace std;const int maxn=6e4+10;struct node{    double s,y;};node ss[maxn];int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%lf",&ss[i].s);    for(int i=0;i<n;i++)        scanf("%lf",&ss[i].y);    double l=0,r=1e9;    while(fabs(1.0*(l-r))>eps)    {        int flag=0;        double mid=(l+r)/2.0;        double s1=mid*ss[0].y*1.0;        double a1=s1+ss[0].s;        double a2=ss[0].s-s1;        for(int i=1;i<n;i++)        {            double s2=mid*ss[i].y*1.0;            double b1=ss[i].s+s2;            double b2=ss[i].s-s2;            if(a2>b1||a1<b2)            {                flag=1;                break;            }            a1=min(a1,b1);            a2=max(a2,b2);        }        if(flag)            l=mid+eps;        else            r=mid-eps;    }    printf("%.12lf",l);    return 0;}


C(dfs)

有一些公园要挂气球,只要是有关联的就要求挂不同颜色。

简单dfs一下,找父亲,与父亲的父亲,和亲兄弟,然后统计一下气球种类的最大值。


#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;const int maxn=2e5+10;int color[maxn];vector<int> s[maxn];int n,cnt,sum;void dfs(int u,int c,int fa){    color[u]=c;    sum=max(sum,c);    int cnt=1;    for(int i=0;i<s[u].size();i++)    {        int v=s[u][i];        if(v==fa)            continue;        while(cnt==color[fa]||cnt==c)            cnt++;        dfs(v,cnt++,u);    }}int main(){    scanf("%d",&n);    for(int i=0;i<n-1;i++)    {        int a,b;        scanf("%d%d",&a,&b);        s[a].push_back(b);        s[b].push_back(a);    }    dfs(1,1,0);    printf("%d\n",sum);    for(int i=1;i<=n;i++)    {        if(i==n)            printf("%d\n",color[i]);        else            printf("%d ",color[i]);    }    return 0;}


0 0