CS Academy Round #43 A B C D

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值