hihocoder编程练习赛73 A 地铁站

 1 /*
 2   Source   :hihocoder编程练习73
 3   Problem  :一个长度为n的串,由若干段1-a[i](假设有Y段)的序列组成,现在中间缺了K个数,问能够还原出来的方案数,需要保证还原出来的子串的个数最少,即最小Y
 4   Solution :1.通过分析剩余的序列,我们可以知道原来最少的时候Y是多少,即看原来的序列有多少单调递增的子段。
 5             2.进行有解的判断,假设已知序列段中每段的最大值是b[i] i=1..Y,如果sum(b[i]) > N,则说明无解,这是序列的长度一定已经超过n了。
 6             3.方案数求解,假设每段序列的最大值为x[i],有sum(x[i])=n,且需要满足x[i]>=b[i],令y[i]=x[i]-b[i]>=0
 7                问题就转化为求sum(y[i])=n-sum(b[i])的解的个数,这是个经典的问题,用隔板法方案数为C(R+Y-1,Y-1), R=n-sum(b[i]).
 8   Date     :2018-08-19-11.57
 9 */
10
11 #include <bits/stdc++.h>
12 using namespace std;
13
14 typedef long long LL;
15 const int MAXN = 100005;
16 const LL MOD7 = 1e9+7;
17
18
19 LL Pow(LL a, LL b)
20 {
21     LL res=1LL;
22     LL ans=a%MOD7;
23     while (b)
24     {
25         if (b&1) res=res*ans%MOD7;
26         ans=ans*ans%MOD7;
27         b>>=1;
28     }
29     return res;
30 }
31
32 int a[MAXN];
33 int N, K, M;
34 int m;
35 LL R;
36 LL Y;
37
38
39 LL C(LL n, LL r)
40 {
41     LL ans=1LL;
42     for (int i=1;i<=r;++i)
43     {
44         ans = ans * (n-i+1) % MOD7;
45         ans = ans * Pow(i, MOD7-2) % MOD7;
46     }
47     return ans;
48 }
49
50 void work()
51 {
52     LL ans=1LL;
53     ans = C((LL)R+Y-1, (LL)min(Y-1, R));
54     printf("%lld\n",ans);
55 }
56
57 int main()
58 {
59 #ifndef ONLINE_JUDGE
60     freopen("test.txt","r",stdin);
61 #endif // ONLINE_JUDGE
62     scanf("%d%d",&N,&K);
63     m=N-K;
64     for (int i=1;i<=m;++i)
65     {
66         scanf("%d",&a[i]);
67     }
68     a[m+1]=0;
69     R=N;
70     Y=0;
71     for (int i=1;i<=m;++i)
72     {
73         if (a[i]>=a[i+1])
74         {
75             ++Y;
76             R-=a[i];
77         }
78     }
79     if (R<0)
80     {
81         printf("No\n");
82         return 0;
83     }
84     work();
85     return 0;
86 }

原文地址:https://www.cnblogs.com/LeeSongt/p/9502231.html

时间: 2025-01-12 02:00:48

hihocoder编程练习赛73 A 地铁站的相关文章

hihocoder 编程练习赛23

第一题:H国的身份证号码I 题意:一个N位的正整数(首位不能是0).每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K.按从小到大的顺序输出所有合法的N位号码,每个号码占一行. 思路:dfs #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N = 20; #define LL long long int n, k, a[N]; void

【hihocoder编程练习赛9】闰秒

题目链接 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 #include<iostream> 6 #include<stdlib.h> 7 #include<set> 8 #include<map> 9 #include<queue> 10 #include<vector&

hihoCoder编程练习赛70

题目1 : 数位翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 n,你可以进行若干次操作,每次操作可以翻转 n 的二进制表示下的某一位,即将 0 变成 1,1 变成 0 现在小 Hi 想知道,至少需要多少次操作,才能将 n 变成 n-1 输入 一个正整数 n 1 ≤ n ≤ 109 输出 输出最少的操作次数 样例输入 10 样例输出 2 1 // 2018-07-29 2 #include <cstdio> 3 #include <cstr

hihoCoder编程练习赛69

题目1 : 偶数长度回文子串 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个小写字母字符串,请判断它是否有长度为偶数的非空连续回文子串 输入 输入包含多组数据. 每组数据包含一行一个小写字母字符串 S 1 ≤ |S| ≤ 105 输出 对于每组数据如果存在,输出YES,否则输出NO 样例输入 cabbad ababa 样例输出 YES NO 1 // 2018-07-29 2 #include <cstdio> 3 #include <cstring

hihoCoder编程练习赛72

题目1 : 玩具设计师 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho作为Z国知名玩具品牌AKIRE的首席设计师,对玩具零件的挑剔程度已经到了叹为观止的地步.所有的玩具零件均在一块由N × M个单位块组成的设计板上切割获得.每个单位块有一个耐用指数aij. 由于玩具制作安全标准要求每个零件的面积至少大于等于S,小Ho想要知道设计板上能切割出满足标准的最大耐用指数的玩具零件为多少. 输入 输入共N+1行,第一行三个整数N,M,S表示设计板的大小以及安全标准中对

hihocoder - [Offer收割]编程练习赛17

hihocoder - [Offer收割]编程练习赛17 题目1 : F1 Score 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和他的小伙伴们一起写了很多代码.时间一久有些代码究竟是不是自己写的,小Hi也分辨不出来了. 于是他实现了一个分类算法,希望用机器学习实现自动分类. 为了评价这个分类算法的优劣,他选出了N份有标记的代码作测试集,并决定用F1 Score作为评价标准. 给出N份代码的实际作者是不是小Hi以及分类算法预测的结果,请你计算F1 Sco

HIHOcoder编程总结

[Offer收割]编程练习赛44 对于第一题题目1 : 扫雷游戏,首先要想清楚思路,虽然是暴力算法,但是这八个方向要自己把坐标写正确,不要慌乱,自己写的时候就写错了一个,第二个就是判断的时候,j + 1>=0,这种是显然的事情,应该是j +1 < N,写草稿也要认真. 还有一个非常非常大的错误. int N = 0; cin >> N; vector<string> input; input.resize(N); for (int i = 0; i < N; ++

hihocoder [Offer收割]编程练习赛18 C 最美和弦(dp)

题目链接:http://hihocoder.com/problemset/problem/1532 题解:一道基础的dp,设dp[i][j][k][l]表示处理到第几个数,当前是哪个和弦错了几次初始x值是多少.这里还要再辅助一个val[k]表示处理到当前情况只错了k次的最小值是多少因为改变的不止是和弦还有初始值,可以看一下代码理解一下. #include <iostream> #include <cstring> #include <cstdio> #include &

hihocoder offer收割编程练习赛13 D 骑士游历

思路: 矩阵快速幂. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 using namespace std; 5 6 typedef long long ll; 7 typedef vector<ll> vec; 8 typedef vector<vec> mat; 9 10 const ll mod = 1e9 + 7; 11 12 ll n, x, y;