BestCoder Round #76

比赛总结:今天的bc 暴露了我很大的问题,首先就是代码能力不足,明明一个很清晰思路的题却被自己做错了几次还找不出错误。第二就是思路还不够敏捷,队友几分钟就ac的题,自己十几分钟还搞不定,明显就是自己近段时间过于注重算法题而忽略思维题的结果,以后还要在这方面加强训练。

DZY Loves Balls Accepts: 659
Submissions: 1393
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
问题描述

DZY喜欢玩球。

他有nnn个球,装进一个大盒子里。每个球上面都写着一个整数。

有一天他打算从盒子中挑两个球出来。他先均匀随机地从盒子中挑出一个球,记为AAA。他不把AAA放回盒子,然后再从盒子中均匀随机地挑出一个球,记为BBB。

如果AAA上的数字严格大于BBB上的数字,那么他就会感到愉悦。

现在告诉你每个球上的数字,请你求出他感到愉悦的概率是多少。

输入描述

第一行ttt,表示有ttt组数据。

接下来ttt组数据。每组数据中,第一行包含一个整数nnn,第二行包含nnn个用空格隔开的正整数aia_ia​i​​,表示球上的数字。

(1≤t≤300,2≤n≤300,1≤ai≤3001\le t\le 300, 2\le n \le 300,1\le a_i \le 3001≤t≤300,2≤n≤300,1≤a​i​​≤300)

输出描述

对于每个数据,输出一个实数答案,保留6位小数。

输入样例

2
3
1 2 3
3
100 100 100

输出样例

0.500000
0.000000

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 330;

int t,n;
int num[maxn];

int main()
{
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        sort(num+1,num+n+1);
        double sum = 0.0;
        for(int i=1;i<=n;i++){
            int k = lower_bound(num+1,num+n+1,num[i])-num;
            sum += (k-1)*1.0/(n-1);
        }
        printf("%.6lf\n",sum/n);
    }
    return 0;
}

DZY Loves Partition Accepts: 154
Submissions: 843
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
问题描述

DZY喜欢拆分数字。他想知道能否把nnn拆成恰好kkk个不重复的正整数之和。

思考了一会儿之后他发现这个题太简单,于是他想要最大化这kkk个正整数的乘积。你能帮帮他吗?

由于答案可能很大,请模109+710^9+710​9​​+7输出。

输入描述

第一行ttt,表示有ttt组数据。

接下来ttt组数据。每组数据包含一行两个正整数n,kn,kn,k。

(1≤t≤50,2≤n,k≤1091\le t\le 50, 2\le n,k \le 10^91≤t≤50,2≤n,k≤10​9​​)

输出描述

对于每个数据,如果不存在拆分方案,输出−1-1−1;否则输出最大乘积模109+710^9 + 710​9​​+7之后的值。

输入样例

4
3 4
3 2
9 3
666666 2

输出样例

-1
2
24
110888111

Hint

第一组数据没有合法拆分方案。
第二组数据方案为3=1+23=1+23=1+2,答案为1×2=21\times 2 = 21×2=2
第三组数据方案为9=2+3+49=2+3+49=2+3+4,答案为2×3×4=242\times 3 \times 4 = 242×3×4=24。注意9=3+3+39=3+3+39=3+3+3是不合法的拆分方案,因为其中包含了重复数字。
第四组数据方案为666666=333332+333334666666=333332+333334666666=333332+333334,答案为333332×333334=111110888888333332\times 333334= 111110888888333332×333334=111110888888。注意要对109+710^9 + 710​9​​+7取模后输出,即110888111110888111110888111。
代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

typedef long long ll;
const ll MOD = 1e9+7;
const int maxn = 2000100;

ll t,n,k;
int num[maxn];

int main()
{
    scanf("%I64d",&t);
    while(t--){
        scanf("%I64d %I64d",&n,&k);
        if(k*(k+1)/2 > n){
            printf("-1\n");
            continue;
        }
        n -= k*(k+1)/2;
        for(int i=1;i<=k;i++){
            num[i] = i;
            num[i] += n/k;
        }
        n%=k;
        for(int i=k;i>=1;i--){
            if(n==0)
                break;
            num[i]++;
            n--;
        }
        ll sum = 1;
        for(int i=1;i<=k;i++)
            sum = sum*num[i]%MOD;
        printf("%I64d\n",sum);
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值