AtCoder Beginner Contest 057 - 初探atcoder

ZJOI讲课听说了atcoder这个OJ,感觉时间段很兹磁,都是晚上八点到九点四十。准备来一发,然后今晚是beginner,也许就是pj-难度吧。。

可是为啥没有写没有过会罚时???qwqqqq(好像是写了我没看见)

然后我大无畏的T4WA了4发(辣鸡出题人卡什么精度)

成功从半个小时AK选手变成了一个小时AK选手(这nm是pj-难度啊说出去我都觉得丢人)。

随手写题解吧。

第一题输出(a+b-1)%24+1 就ok
第二题O(nmlogm),枚举每个学生算出所有站点和他的距离然后排序即可
第三题O(sqrt(n)) ,枚举a*b=n并且max(a,b)最小,从sqrt(n)往下枚举即可。(日啊,我一开始往上枚举T了一发)
第四题O(n^2)的dp,dp[i][j]表示前i个取j个的最大值,然后f[i][j]表示取到dp[i][j]的方案数,然后就转移嘛。。注意最后枚举答案算平均数的时候不能除要换成乘法,不然会被辣鸡出题人卡精度。

只放T4代码吧,,总觉得写这篇东西就会被笑话(你都要省选了这种题你居然不能20min ak??你怎么这么弱啊??)

//QWsin
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100+10;
typedef unsigned long long ll;
const double eps=1e-9;

ll f[maxn][maxn],a[maxn],dp[maxn][maxn];

int main()
{
    int n,l,r;cin>>n>>l>>r;

    for(int i=0;i<maxn;++i) 
        for(int j=0;j<maxn;++j)
            dp[i][j]=(ll)-1e17;

    dp[0][0]=0;f[0][0]=1;
    for(int i=1;i<=n;++i) cin>>a[i];
    for(int i=1;i<=n;++i)
    {
        dp[i][0]=0;f[i][0]=1;
        for(int j=1;j<=i&&j<=r;++j)
        {
            ll t1=dp[i-1][j];
            ll t2=dp[i-1][j-1]+a[i];

            if(t1==t2) dp[i][j]=t1,f[i][j]=f[i-1][j]+f[i-1][j-1];
            else if(t1>t2) dp[i][j]=t1,f[i][j]=f[i-1][j];
            else dp[i][j]=t2,f[i][j]=f[i-1][j-1];
        }
    }

    int pos=0;ll cnt=0;
    for(int i=l;i<=r&&i<=n;++i)
        if(pos==0||dp[n][i]*pos > dp[n][pos]*i) pos=i,cnt=f[n][i];
        else if(dp[n][i]*pos==dp[n][pos]*i) cnt+=f[n][i];

    printf("%.6f\n%lld\n",(double)dp[n][pos]/pos,cnt);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值