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),他会从"上左下右"四个方向中选定两个不同但正交的方向,然后他只 ...
随机推荐
- luogu P2852 [USACO06DEC]牛奶模式Milk Patterns 后缀数组 + Height数组 + 二分答案 + 扫描
后缀数组有一个十分有趣的性质: $height[rk[i]] >= height[rk[i-1]] - 1$ Code: #include <bits/stdc++.h> #d ...
- PAT_A1109#Group Photo
Source: PAT A1109 Group Photo (25 分) Description: Formation is very important when taking a group ph ...
- 启动模拟器的qq
#coding = utf-8from appium import webdriver '''1.手机类型2.版本3.手机的唯一标识 deviceName4.app 包名appPackage5.app ...
- CodeIgniter-CI之MySQL
首先我们需要进行一下配置,这里需要修改的文件为application目录下的config目录下的database.php文件,我们修改相应的配置项,比如这里是我的配置情况: 通常我们在操作数据库之前, ...
- svg文件报错
错误:The content of element type "font-face" is incomplete, it must match "((font-face- ...
- 06.系统编程-3.进程VS线程比较
1.定义的不同 ==进程是系统进行资源分配和调度的一个独立单位.== ==线程是进程的一个实体,是CPU调度和分派的基本单位==,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只 ...
- Spring MVC学习总结(4)——SpringMVC权限管理
1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet. DispatcherServl ...
- orcale 单行函数之数字函数, 日期函数
日期函数: 案例:
- C#--excel操作控件--interop是什么
这个是微软出的操作excel的类库,为什么这个比NPOI的下载量少这么多?
- CODEVS——T 2618 核电站问题
http://codevs.cn/problem/2618/ 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description ...