CS Academy Round #43 A B C D

来源:互联网 发布:在线录像软件 编辑:程序博客网 时间:2024/05/18 03:55

A
题意:
丢两个骰子最高概率得到的和

#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#include <stack>#include <cstring>#include <cmath>#include <vector>#include <ctime>#include <bitset>using namespace std;#define pb push_back#define sd(n) scanf("%d",&n)#define sdd(n,m) scanf("%d%d",&n,&m)#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)#define sld(n) scanf("%lld",&n)#define sldd(n,m) scanf("%lld%lld",&n,&m)#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)#define sf(n) scanf("%lf",&n)#define sff(n,m) scanf("%lf%lf",&n,&m)#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)#define ss(str) scanf("%s",str)#define ans() printf("%d",ans)#define ansn() printf("%d\n",ans)#define anss() printf("%d ",ans)#define lans() printf("%lld",ans)#define lanss() printf("%lld ",ans)#define lansn() printf("%lld\n",ans)#define fansn() printf("%.5f\n",ans)#define r0(i,n) for(int i=0;i<(n);++i)#define r1(i,e) for(int i=1;i<=e;++i)#define rn(i,e) for(int i=e;i>=1;--i)#define rsz(i,v) for(int i=0;i<(int)v.size();++i)#define szz(x) ((int)x.size())#define mst(abc,bca) memset(abc,bca,sizeof abc)#define lowbit(a) (a&(-a))#define all(a) a.begin(),a.end()#define pii pair<int,int>#define pli pair<ll,int>#define mp make_pair#define lrt rt<<1#define rrt rt<<1|1#define X first#define Y second#define PI (acos(-1.0))#define sqr(a) ((a)*(a))typedef long long ll;typedef unsigned long long ull;const int mod = 1000000000+7;const double eps=1e-9;const int inf=0x3f3f3f3f;const ll infl = 10000000000000000;const int maxn=  500+10;const int maxm = 10000+10;int a[10],b[10];int cnt[200];int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    r1(i,6)sd(a[i]);    r1(i,6)sd(b[i]);    for(int i=1;i<=6;++i)    {        for(int j=1;j<=6;++j)        {            int c = a[i]+b[j];            cnt[c]++;        }    }    int mx = 0,ans = 0;    for(int i=1;i<=100;++i)    {        if(cnt[i]>mx)ans = i,mx = cnt[i];    }    ansn();    return 0;}

B
题意:
画水平和垂直分割线把矩形分成很多个小矩形
算里面有多少个正方形

#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#include <stack>#include <cstring>#include <cmath>#include <vector>#include <ctime>#include <bitset>using namespace std;#define pb push_back#define sd(n) scanf("%d",&n)#define sdd(n,m) scanf("%d%d",&n,&m)#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)#define sld(n) scanf("%lld",&n)#define sldd(n,m) scanf("%lld%lld",&n,&m)#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)#define sf(n) scanf("%lf",&n)#define sff(n,m) scanf("%lf%lf",&n,&m)#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)#define ss(str) scanf("%s",str)#define ans() printf("%d",ans)#define ansn() printf("%d\n",ans)#define anss() printf("%d ",ans)#define lans() printf("%lld",ans)#define lanss() printf("%lld ",ans)#define lansn() printf("%lld\n",ans)#define fansn() printf("%.5f\n",ans)#define r0(i,n) for(int i=0;i<(n);++i)#define r1(i,e) for(int i=1;i<=e;++i)#define rn(i,e) for(int i=e;i>=1;--i)#define rsz(i,v) for(int i=0;i<(int)v.size();++i)#define szz(x) ((int)x.size())#define mst(abc,bca) memset(abc,bca,sizeof abc)#define lowbit(a) (a&(-a))#define all(a) a.begin(),a.end()#define pii pair<int,int>#define pli pair<ll,int>#define mp make_pair#define lrt rt<<1#define rrt rt<<1|1#define X first#define Y second#define PI (acos(-1.0))#define sqr(a) ((a)*(a))typedef long long ll;typedef unsigned long long ull;const int mod = 1000000000+7;const double eps=1e-9;const int inf=0x3f3f3f3f;const ll infl = 10000000000000000;const int maxn=  100000+10;const int maxm = 10000+10;int y[maxn];int x[maxn];int cnt[maxn];int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    int h,w,n,m;    sdd(h,w);    sdd(n,m);    r1(i,n)sd(y[i]);    r1(i,m)sd(x[i]);    sort(y+1,y+1+n);    sort(x+1,x+1+m);    for(int i=1;i<=n;++i)    {        int tmp = y[i]-y[i-1];        cnt[ tmp]++;    }    cnt[ h-y[n] ]++;    ll ans = 0;    r1(i,m)    {        int tmp = x[i]-x[i-1];        if(tmp==0)continue;        ans+=cnt[tmp];    }    if(x[m]!=w)    ans+=cnt[ w-x[m] ];    lansn();    return 0;}

C
题意:
火车长为L 在x坐标上0和D有加油站
另外在[0,D]有n个加油站
只要火车的线段跟点有交点就不用移动
否则就需要往前或者往后推
问火车在[0,D]上要加油需要推动的距离的期望

做法
相交的时候肯定是不用推的 那么只要考虑不想交的状态
对于一段需要移动的位置求一个需要推动的距离的连续概率
这里写图片描述
对于一段无法跟加油站相交的位置需要推动的距离如图
直接求面积

#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#include <stack>#include <cstring>#include <cmath>#include <vector>#include <ctime>#include <bitset>using namespace std;#define pb push_back#define sd(n) scanf("%d",&n)#define sdd(n,m) scanf("%d%d",&n,&m)#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)#define sld(n) scanf("%lld",&n)#define sldd(n,m) scanf("%lld%lld",&n,&m)#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)#define sf(n) scanf("%lf",&n)#define sff(n,m) scanf("%lf%lf",&n,&m)#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)#define ss(str) scanf("%s",str)#define ans() printf("%d",ans)#define ansn() printf("%d\n",ans)#define anss() printf("%d ",ans)#define lans() printf("%lld",ans)#define lanss() printf("%lld ",ans)#define lansn() printf("%lld\n",ans)#define fansn() printf("%.10f\n",ans)#define r0(i,n) for(int i=0;i<(n);++i)#define r1(i,e) for(int i=1;i<=e;++i)#define rn(i,e) for(int i=e;i>=1;--i)#define rsz(i,v) for(int i=0;i<(int)v.size();++i)#define szz(x) ((int)x.size())#define mst(abc,bca) memset(abc,bca,sizeof abc)#define lowbit(a) (a&(-a))#define all(a) a.begin(),a.end()#define pii pair<int,int>#define pli pair<ll,int>#define mp make_pair#define lrt rt<<1#define rrt rt<<1|1#define X first#define Y second#define PI (acos(-1.0))#define sqr(a) ((a)*(a))typedef long long ll;typedef unsigned long long ull;const int mod = 1000000000+7;const double eps=1e-8;const int inf=0x3f3f3f3f;const ll infl = 10000000000000000;const int maxn=  100000+10;const int maxm = 10000+10;int a[maxn];int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    int d,l,n;    sddd(d,l,n);    r1(i,n)sd(a[i]);    a[n+1] = d;    sort(a+1,a+1+n);    ll sum=0;    n++;    r1(i,n)    {        int check = a[i]-a[i-1];        if(check>l)        {            sum+=1LL*(check-l)*(check-l);        }    }    double ans = 0.25*sum /d;    fansn();    return 0;}

D
题意:给一个图求A-C,B-C,A-B相等并且距离最小时候的ABC

做法
先考虑有没有一个长度为3的环 有则长度都为1
否则一定是长度至少为2
如果有度为3的点那一定存在长度为2的合法情况
如果不存在则图只有链或者环
判断是否是环并且长度为3的倍数 这样才能三个到各2个的距离相等

#include <iostream>#include <algorithm>#include <sstream>#include <string>#include <queue>#include <cstdio>#include <map>#include <set>#include <utility>#include <stack>#include <cstring>#include <cmath>#include <vector>#include <ctime>#include <bitset>using namespace std;#define pb push_back#define sd(n) scanf("%d",&n)#define sdd(n,m) scanf("%d%d",&n,&m)#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)#define sld(n) scanf("%lld",&n)#define sldd(n,m) scanf("%lld%lld",&n,&m)#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)#define sf(n) scanf("%lf",&n)#define sff(n,m) scanf("%lf%lf",&n,&m)#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)#define ss(str) scanf("%s",str)#define ans() printf("%d",ans)#define ansn() printf("%d\n",ans)#define anss() printf("%d ",ans)#define lans() printf("%lld",ans)#define lanss() printf("%lld ",ans)#define lansn() printf("%lld\n",ans)#define fansn() printf("%.5f\n",ans)#define r0(i,n) for(int i=0;i<(n);++i)#define r1(i,e) for(int i=1;i<=e;++i)#define rn(i,e) for(int i=e;i>=1;--i)#define rsz(i,v) for(int i=0;i<(int)v.size();++i)#define szz(x) ((int)x.size())#define mst(abc,bca) memset(abc,bca,sizeof abc)#define lowbit(a) (a&(-a))#define all(a) a.begin(),a.end()#define pii pair<int,int>#define pli pair<ll,int>#define mp make_pair#define lrt rt<<1#define rrt rt<<1|1#define X first#define Y second#define PI (acos(-1.0))#define sqr(a) ((a)*(a))typedef long long ll;typedef unsigned long long ull;const int mod = 1000000000+7;const double eps=1e-9;const int inf=0x3f3f3f3f;const ll infl = 10000000000000000;const int maxn=  100000+10;const int maxm = 10000+10;int n,m;vector<int>G[maxn];int deg[maxn];bool vis[maxn];int fa[maxn];int d[maxn];int faf(int x){    return fa[x]==x?x:fa[x] = faf(fa[x]);}void un(int a,int b){    int f1 = faf(a),f2 = faf(b);    if(f1!=f2)fa[f2]=f1,d[f1] +=d[f2];}int rot[maxn];int cir[maxn];int cnt;void dfs(int u,int f){    vis[u]=1;    rot[++cnt] = u;    rsz(i,G[u])    {        int v = G[u][i];        if(v==f)continue;        if(!vis[v])        {            dfs(v,u);        }    }}int main(){#ifdef LOCAL    freopen("input.txt","r",stdin);//    freopen("output.txt","w",stdout);#endif // LOCAL    sdd(n,m);    r1(i,n)fa[i] = i,d[i]=1;    while(m--)    {        int u,v;        sdd(u,v);        G[u].pb(v),G[v].pb(u);        deg[u]++,deg[v]++;        un(u,v);    }    int ans = inf , idx = 0;    for(int i=1;i<=n;++i)    {        int fat = faf(i);        if(deg[i]==2)cir[fat]++;    }    for(int i=1;i<=n;++i)    {        if(d[i]%3==0&&faf(i)==i&&cir[i]==d[i])        {            if(ans>d[i])            {                ans = d[i];                idx = i;            }        }    }    dfs(idx,0);    int a = ans/3;    if(!idx||ans>6)    for(int i=1;i<=n;++i)    {        if(deg[i]>=3)        {            for(int j=0;j<3;++j)                printf("%d%c",G[i][j]," \n"[j==2]);            return 0;        }    }    if(idx)printf("%d %d %d\n",rot[a],rot[2*a],rot[3*a]);    if(!idx)return 0*puts("-1");    return 0;}
原创粉丝点击