hihoCoder挑战赛31
#1595 : Numbers
描述
给定n个整数常数c[1], c[2], ..., c[n]和一个整数k。现在需要给2k个整数变量x[1], x[2], ..., x[k], y[1], y[2], ..., y[k]赋值,满足
(1)对于所有1 ≤ i ≤ k,都有x[i] ≤ y[i]。
(2)对于所有1 ≤ i ≤ n,都存在至少一个j (1 ≤ j ≤ k),使得x[j] ≤ c[i] ≤ y[j]。
求出S=(y[1] + y[2] + ... + y[k]) - (x[1] + x[2] + ... + x[k])的最小值。
输入
第一行两个整数n, k。(1 ≤ n, k ≤ 100000)
接下来n行,每行一个整数c[i]。 (-1000000000 ≤ c[i] ≤ 1000000000)
输出
输出一个整数表示S的最小值。
样例解释
x[1]=-5, y[1]=4,
x[2]=10, y[2]=10.
- 样例输入
-
5 2
-5
0
10
4
0 - 样例输出
-
9
首先,如果k≥n则可以零距离夹住每个c,此时答案为0。
当k<n时,只需将n个数字从小到大排序,去掉其中最长的k-1个间隔即可。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long long c[], d[];
int cmp(const void * x, const void * y) {
return *((long long *) x) > *((long long *) y);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n, k;
scanf("%d%d", &n, &k);
for (int i = ; i < n; i++) {
scanf("%lld", &c[i]);
}
if (k >= n) {
printf("0\n");
return ;
}
qsort(c, n, sizeof(long long), cmp);
for (int i = ; i < n - ; i++) {
d[i] = c[i + ] - c[i];
}
qsort(d, n - , sizeof(long long), cmp);
long long ans = c[n - ] - c[];
for (int i = , j = n - ; i < k; i++, j--) {
ans -= d[j];
}
printf("%lld\n", ans);
return ;
}
#1596 : Beautiful Sequence
描述
对于一个正整数列a[1], ... , a[n] (n ≥ 3),如果对于所有2 ≤ i ≤ n - 1,都有a[i-1] + a[i+1] ≥ 2 × a[i],则称这个数列是美丽的。
现在有一个正整数列b[1], ..., b[n],请计算:将b数列均匀随机打乱之后,得到的数列是美丽的概率P。
你只需要输出(P × (n!))mod 1000000007即可。(显然P × (n!)一定是个整数)
输入
第一行一个整数n。 (3 ≤ n ≤ 60)
接下来n行,每行一个整数b[i]。 (1 ≤ b[i] ≤ 1000000000)
输出
输出(P × (n!))mod 1000000007。
- 样例输入
-
4
1
2
1
3 - 样例输出
-
8
满足美丽性质的序列形状为V字形,即先递减后递增,单调序列可以理解为左边或右边长度为0的V字形。
V字形最低点的数字一定是数列中最小的数字,把数列按从小到大的顺序依次添加到两端,只要保证每次添加时和该端最边上的两个数字满足美丽性质,即可实现美丽数列的构造。
首先按从小到大的顺序排序
令dp[i][j][k][l]为当前的数列最左边的两个的下标分别为ij,最右边的两个数字的下标分别为kl时的美丽数列个数。若i=j,表示右边没有了;若k=l,表示左边没有了。
可以通过一个四重循环ijkl实现状态转移,第一重表示当前要添加下标为i的数字,显然,此时数列最左端或最右端的数字中一定有一个编号为i-1,用三重循环jkl枚举另外三个数字。i-1在左边或右边分两种情况,每种情况下各自可能将i添加到左边或右边,一共四次判断,复杂度为O(n^4)。
再想一想的话,其实在循环i时,两端的四个数字里除了必定有一个i-1之外,i-2肯定也在其中,所以其实只用枚举另外两个数字就行了,这种情况下要写八次判断,复杂度为O(n^3),应该也是可以的,不过没有试。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n;
long long dp[][][][], a[];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
scanf("%d", &n);
for (int i = ; i < n; i++) {
scanf("%lld", &a[i]);
}
for (int i = ; i < n; i++) {
for (int j = i + ; j < n; j++) {
if (a[i] > a[j]) {
long long t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
int cnt = ;
for (int i = ; i < n; i++) {
if (a[i] == a[]) {
cnt++;
}
}
for (int i = ; i < n; i++) {
a[i] = a[i + cnt - ];
}
n = n - cnt + ;
memset(dp, , sizeof(dp));
dp[][][][] = dp[][][][] = dp[][][][] = ;
for (int i = ; i < n; i++) {
for (int j = ; j < i; j++) {
for (int k = ; k < i; k++) {
for (int l = ; l < i; l++) {
//dp[i-1,j,k,l]
if (i - != j && k != l) {
if ((long long)(a[i] + a[j]) >= (long long)( * a[i - ])) {
dp[i][i - ][k][l] += dp[i - ][j][k][l];
dp[i][i - ][k][l] %= ;
}
if ((long long)(a[k] + a[i]) >= (long long)( * a[l])) {
dp[i - ][j][l][i] += dp[i - ][j][k][l];
dp[i - ][j][l][i] %= ;
}
}
//dp[j,k,l,i-1]
if (j != k && l != i - ) {
if ((long long)(a[i] + a[k]) >= (long long)( * a[j])) {
dp[i][j][l][i - ] += dp[j][k][l][i - ];
dp[i][j][l][i - ] %= ;
}
if ((long long)(a[l] + a[i]) >= (long long)( * a[i - ])) {
dp[j][k][i - ][i] += dp[j][k][l][i - ];
dp[j][k][i - ][i] %= ;
}
}
}
}
}
}
long long ans = ;
if (n > ) {
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
for (int k = ; k < n; k++) {
ans += dp[n - ][i][j][k];
ans += dp[i][j][k][n - ];
ans %= ;
}
}
}
} else {
ans = ;
}
for (int i = ; i <= cnt; i++) {
ans = (ans * i) % ;
}
printf("%lld\n", ans);
return ;
}
hihoCoder挑战赛31的更多相关文章
- hihoCoder挑战赛23
hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...
- [题解]hihoCoder挑战赛18——题目1 神奇字符串
题目地址:http://hihocoder.com/problemset/problem/1264 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 我们说两个字符串是非常 ...
- hihocoder挑战赛26
某蒟蒻成功的·写出了T1并rank16...小岛的题目真难... 传送门:http://hihocoder.com/contest/challenge26 T1 如果你想要暴力枚举的话显然是不行的 如 ...
- hihoCoder挑战赛25
萌新第一次打hihoCoder的比赛有点慌 T1 T1并不是特别难想到dp就好做了 显而易见的是一个01背包问题 Code: #include <cstdio> #include < ...
- hihoCoder挑战赛11.题目4 : 高等理论计算机科学(LCA)
clj在某场hihoCoder比赛中的一道题,表示clj的数学题实在6,这道图论貌似还算可以... 题目链接:http://hihocoder.com/problemset/problem/1167 ...
- hihoCoder挑战赛34 B题(快速求第k轮冒泡排序的结果)
官方题解:https://media.hihocoder.com/contests/challenge34/tutorials-previewed.pdf 题目链接:http://hihocoder. ...
- 【hihoCoder挑战赛28 A】异或排序
[题目链接]:http://hihocoder.com/problemset/problem/1509 [题意] [题解] 每次找到相邻两个数的二进制形式中; 不同的最高位; 显然S在这一位必然是确定 ...
- hihoCoder挑战赛1 毁灭者问题
题目链接:http://hihocoder.com/problemset/problem/1034 数据结构题,由于每个魔法单位有着不同的回复速度和上限,所以不能根据吸收时间点进行查询和更新.但是如果 ...
- hihocoder挑战赛13A
#1191 : 小W与网格 描述 给定一个n*m的网格,左上角(1, 1),右下角(n, m). 小w在(i, j),他会从"上左下右"四个方向中选定两个不同但正交的方向,然后他只 ...
随机推荐
- Data mapping-数据映射
数据映射:根据数据的结构信息建立数据间的映射操作机制. 数据映射的要素: 一.数据 1.源数据: 2.目标数据: 3.数据间关系: 4.数据的元数据(结构信息). 5.元素类型的对应关系. 二.元数据 ...
- this、super关键字以及他们各自的作用
this:代表当前对象的引用,谁来调用我,我就代表谁 super:代表当前对象父类的引用 this和super的使用区别 A:调用成员变量 this.成员变量 调用本类的成员变量,也可以调用父类的成 ...
- PAT_A1138#Postorder Traversal
Source: PAT A1138 Postorder Traversal (25 分) Description: Suppose that all the keys in a binary tree ...
- 移动端出现弹出层body滚动
$("#box").on("click",function(e){ e.stopPropagation(); e.preventDefault(); $(&qu ...
- 【剑指Offer】31、从1到n整数中1出现的次数
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他 ...
- 【CF1173D】NanuuAndCircle
题目链接:http://codeforces.com/contest/1173/problem/D 赛场上弱爆了的小菜鸡(本人),怎么也没想到这道看起来近似于神仙计数/生成函数的题正解竟然如此简洁. ...
- 【hihoCoder挑战赛28 A】异或排序
[题目链接]:http://hihocoder.com/problemset/problem/1509 [题意] [题解] 每次找到相邻两个数的二进制形式中; 不同的最高位; 显然S在这一位必然是确定 ...
- WebFont与页面font-icon图标研究
当你打开(绝大部分)网站,页面上将会有许多形形色色的小图标(icon),适当的icon的可以达到一图胜千言的目的,使网页的表现效果更佳. 关于页面icon的制作,比较传统的方法是,让设计师去设计一个个 ...
- HDU 4456 Crowd
Crowd Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- Cloudera 5.8.3 SolrCloud+HDFS的索引数据备份和恢复。(需重启solr进程。)
一.备份基于HDFS的solrCloud集合数据 1.确认要备份的solr文件夹. /solr/history_customer_collection_test 2.开启HDFS快照功能. hdfs ...