[Offer收割]编程练习赛34
共同富裕
显然每次选最大的数字,其余的加一。也可以理解为每次选一个最大的数字减一,直到所有数字都变成最小的数字为止。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void * x, const void * y) {
//x < y
return (*((int *)(x))) > (*((int *)(y))) ? : -;
}
int a[];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
for (int i = ; i < n; i++) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), cmp);
long long ans = ;
for (int i = ; i < n; i++) {
ans += a[i] - a[];
}
printf("%lld\n", ans);
return ;
}
股票价格3
维护一个数组,按时间顺序排列,表示当前还未被超过的价格。显然,这个数组一定是降序的。因为如果出现i<j且a[i]>a[j],则第i天的价格已经被超过,不应出现在数组中。
从左到右遍历每天的价格,当处理第i天时,首先将a[i]插入维护的数组,再删除由于a[i]的插入产生的逆序对。由于a[i]插入前数组中得价格均未被超过,所以被删除的价格都是被a[i]首次超过,记录这些价格的日期与i之差。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void * x, const void * y) {
//x < y
return (*((int *)(x))) > (*((int *)(y))) ? : -;
}
struct node {
int price, id;
};
int a[], ans[], size;
node stack[];
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
scanf("%d", &n);
for (int i = ; i < n; i++) {
scanf("%d", &a[i]);
}
stack[].price = a[], stack[].id = , size = ;
memset(ans, -, sizeof(ans));
for (int i = ; i < n; i++) {
stack[size].price = a[i];
stack[size].id = i;
size++;
while (size > ) {
if (stack[size - ].price >= stack[size - ].price) {
break;
}
ans[stack[size - ].id] = i - stack[size - ].id;
stack[size - ] = stack[size - ];
size--;
}
}
for (int i = ; i < n; i++) {
printf("%d\n", ans[i]);
}
return ;
}
超市规划
区间动态规划在遇到时间问题时想一想四边形不等式。
首先,最优的分配肯定满足每个超市控制的小区是连续的一段;其次,一段连续的几个小区由一个超市控制,则最优的点坐标为各个超市坐标的平均数。
dp[i][j]表示前i个小区由j个超市控制,w[l][r]表示从第l个小区到第r个小区由一个超市控制的最小不方便程度,则dp[i][j]=min{dp[k-1][j-1]+w[k][i] | 0<=k<=r}。
nk的范围都是2000,时间肯定是不够的。可以用四边形不等式来优化,证明是不会证的,输出了一下各个k点选择的值,发现是满足的,于是就直接上了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void * x, const void * y) {
//x < y
return (*((double *)(x))) > (*((double *)(y))) ? : -;
}
int p[][];
double x[], sum[], c[];
double dp[][], f[][];
double qwe(int l, int r) {
double sum_ = l == ? sum[r] : sum[r] - sum[l - ], c_ = l == ? c[r] : c[r] - c[l - ], ave;
ave = sum_ / (r - l + 1.0);
return (r - l + 1.0) * ave * ave - * sum_ * ave + c_;
} 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("%lf", &x[i]);
}
qsort(x, n, sizeof(double), cmp);
if (k >= n) {
printf("0.000\n");
return ;
}
sum[] = x[], c[] = x[] * x[];
for (int i = ; i < n; i++) {
sum[i] = sum[i - ] + x[i];
c[i] = c[i - ] + x[i] * x[i];
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= k; j++) {
if (i < j) {
dp[i][j] = ;
} else {
dp[i][j] = 1e10;
}
}
}
for (int i = ; i < n; i++) {
for (int j = ; j <= k; j++) {
if (i < j) {
dp[i][j] = ;
continue;
}
dp[i][j] = qwe(, i);
p[i][j] = ;
int st = p[i - ][j] > p[i][j - ] ? p[i][j - ] : p[i - ][j];
for (int l = st; l <= i; l++) {
double tmp = qwe(l, i);
if (dp[i][j] > dp[l - ][j - ] + tmp) {
dp[i][j] = dp[l - ][j - ] + tmp;
p[i][j] = l;
}
}
}
}
printf("%.3lf\n", dp[n - ][k]);
return ;
}
有趣的子区间
首先构造出1-1e9中所有的回文数,然后依次计算包含0个、2个......回文数的区间个数。计算时提出公因子,可以减少计算时间。
没调通,懒的再搞了。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
using namespace std;
vector<long long> v;
const long long maxn = ;
const long long p[] = {, , , , , , , , , };
long long d[], s[];
int cmp(const void * x, const void * y) {
//x < y
return (*((double *)(x))) > (*((double *)(y))) ? : -;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
v.clear();
for (int i = ; i < ; i++) v.push_back(i), v.push_back(i * + i);
for (int i = ; i < ; i++) {
int tmp;
long long ttmp;
for (int j = p[i - ]; j < p[i]; j++) {
tmp = j;
for (int k = ; k < i; k++) {
d[k] = tmp % ;
tmp /= ;
}
if (i < ) {
for (int k = ; k < i; k++) d[ * i - - k] = d[k];
ttmp = ;
for (int k = * i - ; k >= ; k--)ttmp = ttmp * + d[k];
v.push_back(ttmp);
}
for (int k = ; k < i - ; k++) d[ * k - - k] = d[k];
ttmp = ;
for (int k = * i - ; k >= ; k--)ttmp = ttmp * + d[k];
v.push_back(ttmp);
}
}
v.push_back(), v.push_back();
sort(v.begin(), v.end());
long long a, b;
scanf("%lld%lld", &a, &b);
int l, r;
for (int i = ; i < v.size(); i++) {
if (v[i] >= a) {
l = i;
break;
}
}
for (int i = v.size() - ; i >= ; i--) {
if (v[i] <= b) {
r = i;
break;
}
}
for (int i = l; i < r; i++) d[i] = v[i + ] - v[i];
d[r] = b > v[r] ? b - v[r] : ;
s[r] = d[r], s[r - ] = d[r - ];
for (int i = r - ; i >= l; i--) s[i] = s[i + ] + d[i];
long long ans = ;
for (int i = l; i <= r; i++) {
long long pl, pr;
if (i == l) pl = v[l] - a + ;
else pl = d[i - ];
pr = s[i + ];
ans += pl * pr;
}
ans += (v[l] - a) * (v[l] - a + ) / ;
ans += (b - v[r]) * (b - v[r] + ) / ;
for (int i = l; i < r; i++) ans += (d[i] - ) * d[i] / ;
printf("%lld\n", ans);
return ;
}
[Offer收割]编程练习赛34的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)
描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
- [Offer收割]编程练习赛48
题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...
- [Offer收割]编程练习赛3 - 题目3 : 智力竞赛
智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...
- [Offer收割]编程练习赛5-1 小Ho的防护盾
#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...
- hiho #1272 买零食 [Offer收割]编程练习赛2
#1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...
随机推荐
- swift 类型系统 Self self Type
namedClass:静态类型:与类型实现直接关联:可以用于初始化.类型检查等. namedClass.self:@thick,脱敏(脱关)类型:动态类型:可以作为元类型的实例:可以作为类型参量进行传 ...
- 移动pc常用Meta标签
移动常用 <meta charset="UTF-8"> <title>{$configInfos['store_title']}</title> ...
- 微信小程序开发常用方法
1.函数中访问data中的数据 _this.setData({ // 日历数据 signList: dataList, // 当前日期 todayDay: str }) 2.if判断 wx:if=&q ...
- webpack学习(五)—webpack+react+es6(第1篇)
如果你看过webpack学习系列的前一个文章,接下来做的东西会比较简单 :webpack学习(四)— webpack-dev-server react发展的很快,现在大部分开发react相关的项目,都 ...
- Python这些问题你会吗?
inal作用域的代码一定会被执行吗? 正常的情况下,finally作用域的代码一定会被执行的,不管是否发生异常.哪怕是调用了sys.exit函数,finally也是会被执行的,那怎么样才能让final ...
- 如何查看系统的界面,比如费用申请单的序时簿界面引用的是哪一个ListUi.快捷键alt+shift+d 然后选中该ListUI大框框,就可以看到引用的是哪一个了.
如何查看系统的界面,比如费用申请单的序时簿界面引用的是哪一个ListUi.快捷键alt+shift+d 然后选中该ListUI大框框,就可以看到引用的是哪一个了.
- CSS学习笔记之CSS3新特性
目录 1.边框 2.背景 3.文本 4.字体 5.转换 6.过渡 7.动画 8.多列 9.自定义尺寸 CSS 用于控制网页的样式和布局,而 CSS3 是最新的 CSS 标准,这篇文章将着重介绍 CSS ...
- php如何判断SQL语句的查询结果是否为空?
PHP与mysql这对黄金搭档配合的相当默契,但偶尔也会遇到一些小需求不知道该怎么做,例如今天要谈到的:如何判断sql语句查询的结果集是否为空! 我们以查询学生信息为例,来看看究竟如何实现我们的需求. ...
- 《奋斗吧!菜鸟》 第八次作业:Alpha冲刺 Scrum meeting 1
项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11012922.html 团队名称 奋斗吧!菜鸟 作业学习目标 A ...
- POJ 3678
这道题唯一一个注意的地方是,如出现X\/Y=0这种关系时,X=0,Y=0.已经是可以肯定的关系了,所以可以连边X->-X. 我也错了上面这地方.看来,还不够.以后要细心才好. #include ...