18: Array C

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 586  Solved: 104
[Submit][Status][Web Board]

Description

Giving two integers  and  and two arrays  and  both with length , you should construct an array  also with length  which satisfied:

1.0≤Ci≤Ai(1≤i≤n)

2.

and make the value S be minimum. The value S is defined as:

Input

There are multiple test cases. In each test case, the first line contains two integers n(1≤n≤1000) andm(1≤m≤100000). Then two lines followed, each line contains n integers separated by spaces, indicating the array Aand B in order. You can assume that 1≤Ai≤100 and 1≤Bi≤10000 for each i from 1 to n, and there must be at least one solution for array C. The input will end by EOF.

Output

For each test case, output the minimum value S as the answer in one line.

Sample Input

3 4
2 3 4
1 1 1

Sample Output

6

HINT

In the sample, you can construct an array [1,1,2](of course [1,2,1] and [2,1,1] are also correct), and  is 6.

题目大意:给你n,m。表示a数组和b数组。然后让你选m个数组成c数组,保证c[i] <= a[i],要求sigma(c[i]*c[i]*b[i])求和最小。可能没描述不太清楚,自己再看看题吧。。。

解题思路:自己想了一个mlogn的做法,但是一直超时到死。。。赛后听大牛的解法,的确很巧妙ORZ。

自己的超时想法:

#include<stdio.h>
#include<algorithm>
//#include<string.h>
//#include<math.h>
//#include<string>
//#include<iostream>
#include<queue>
//#include<stack>
//#include<map>
//#include<vector>
//#include<set>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn = 1e3 + 30;
const LL INF = 0x3f3f3f3f;
const LL mod = 9973;
typedef long long LL;
typedef unsigned long long ULL;
struct Num{
int b, c, prod, id;
bool operator < (const Num & rhs)const{
return prod > rhs.prod;
}
}nums[maxn];
int A[maxn], B[maxn], ans[maxn];
priority_queue<Num>PQ;
int Scan() { //输入外挂
int res = 0, flag = 0;
char ch;
if((ch = getchar()) == '-') flag = 1;
else if(ch >= '0' && ch <= '9') res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9')
res = res * 10 + (ch - '0');
return flag ? -res : res;
}
void Out(int a) { //输出外挂
if(a < 0) { putchar('-'); a = -a; }
if(a >= 10) Out(a / 10);
putchar(a % 10 + '0');
}
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
while(!PQ.empty()) PQ.pop();
for(int i = 1; i <= n; ++i){
scanf("%d",&A[i]);
// A[i] = Scan();
nums[i].c = 1;
}
for(int i = 1; i <= n; i++){
scanf("%d",&nums[i].b);
// nums[i].b = Scan();
nums[i].id = i;
nums[i].prod = nums[i].b * (nums[i].c*nums[i].c);
PQ.push(nums[i]);
}
Num nm = PQ.top(); PQ.pop();
ans[nm.id]++;
Num tmp;
for(int i = 1; i < m; ++i){
if(PQ.empty()){
ans[nm.id] += m-i; break;
}
// cout<<PQ.size()<<" ++++"<<endl;
tmp = PQ.top();
// printf("%d %d %d++\n",tmp.id,tmp.c,tmp.prod);
nm.c++;
nm.prod = nm.b*nm.c*nm.c;
if(nm.c > A[nm.id]){
PQ.pop();
nm = tmp;
ans[nm.id] = nm.c; continue;
}
if(tmp.prod < nm.prod){
PQ.pop();
PQ.push(nm);
nm = tmp;
ans[nm.id] = nm.c;
}else{
ans[nm.id] = nm.c;
}
}
int res = 0;
for(int i = 1; i <= n; ++i){
// printf("%d\n",ans[i]);
res += nums[i].b * ans[i] * ans[i];
ans[i] = 0;
}
//printf("%d\n",res);
Out(res);
puts("");
}
return 0;
}

  

大牛的解法:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn = 1e6 + 30;
const LL INF = 0x3f3f3f3f;
const LL mod = 9973;
typedef long long LL;
typedef unsigned long long ULL;
int a[maxn],b[maxn] ,cost[maxn];
int main(){
int n, m;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i = 1; i <= n; ++i){
scanf("%d",&a[i]);
}
for(int i = 1; i <= n; ++i){
scanf("%d",&b[i]);
}
int cnt = 0;
for(int i = 1; i <= n; ++i){
for(int j = 1; j <= a[i]; ++j){
cost[cnt] = (2*j-1)*b[i];
cnt++;
}
}
sort(cost,cost+cnt);
LL res = 0;
for(int i = 0; i < m; ++i){
res += cost[i];
}
printf("%lld\n",res);
}
return 0;
}

  

HZAU 18——Array C——————【贪心】的更多相关文章

  1. CodeForces-721D-Maxim and Array(优先队列,贪心,分类讨论)

    链接: https://vjudge.net/problem/CodeForces-721D 题意: Recently Maxim has found an array of n integers, ...

  2. CF1479B Painting the Array(贪心+DP)

    题目大意:给你一个序列,让你提取出一个子序列A,剩余的部分组成子序列B,现定义seg(x)表示把序列x中相邻的相同数合并成一个数后,序列x的长度,分别求seg(A)+seg(B)的最大值和最小值,n= ...

  3. hzau 1209 Deadline(贪心)

    K.Deadline There are N bugs to be repaired and some engineers whose abilities are roughly equal. And ...

  4. Codeforces 402D Upgrading Array:贪心 + 数学

    题目链接:http://codeforces.com/problemset/problem/402/D 题意: 给你一个长度为n的数列a[i],又给出了m个“坏质数”b[i]. 定义函数f(s),其中 ...

  5. Codeforces G. Nick and Array(贪心)

    题目描述: Nick had received an awesome array of integers a=[a1,a2,…,an] as a gift for his 5 birthday fro ...

  6. Codeforces Round #581 (Div. 2) B. Mislove Has Lost an Array (贪心)

    B. Mislove Has Lost an Array time limit per test1 second memory limit per test256 megabytes inputsta ...

  7. upc 组队赛18 STRENGTH【贪心模拟】

    STRENGTH 题目链接 题目描述 Strength gives you the confidence within yourself to overcome any fears, challeng ...

  8. Codeforces Round #696 (Div. 2) C. Array Destruction (贪心,multiset)

    题意:有\(n\)个数,首先任选一个正整数\(x\),然后在数组中找到两个和为\(x\)的数,然后去掉这两个数,\(x\)更新为两个数中较大的那个.问你最后时候能把所有数都去掉,如果能,输出最初的\( ...

  9. js对象 数组Array详解 (参照MDN官网:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)

    一:数组的创建方式: 1.采用直接量创建 var arr = [];//创建一个空数组 var arr2 = [1,2,3];//创建一个有三个元素的数组 2.采用构造函数创建 a.var arr1 ...

随机推荐

  1. golang 重构博客统计服务

    欢迎关注楼主与他的小伙伴们的小站,每周分享一些技术文章,让我们在技术上一起成长------> 戳这里,欢迎光临小站 -_- 作为一个后端开发,在docker,etcd,k8s等新技术不断涌现的今 ...

  2. vs2015+opencv3.3.1 实现 c++ 彩色高斯滤波器(Gaussian Smoothing, Gaussian Blur, Gaussian Filter)

    //高斯滤波器 https://github.com/scutlzk#include <opencv2\highgui\highgui.hpp> #include <iostream ...

  3. 模态显示PresentModalViewController

    1.主要用途 弹出模态ViewController是IOS变成中很有用的一个技术,UIKit提供的一些专门用于模态显示的ViewController,如UIImagePickerController等 ...

  4. 上课总结-数据库Chapter2: 关系数据库

    Chapter2: 关系数据库 一.搞懂主键 外键关系 主键(主码):能唯一标识一个元组的某一属性组. 外键:不是这组数据的主键 但是另一组数据的唯一主键(当这组数据的主键有2个时 可以作为外键) 例 ...

  5. 20165219 预备作业3 Linux安装及学习

    20165219 预备作业3 Linux安装及学习 安装虚拟机 在安装的过程中遇到了不少的问题,在同学的帮助下都得到了解决.比如在新建虚拟机的时候没有64位这个选项,后来知道需要开启虚拟化,然后是安装 ...

  6. oracle为IN OUT变量或OUT变量赋值时提示“表达式''不能用作赋值目标”

    是因为IN OUT变量和OUT变量是要输出的,不能赋给它常量值,这样它就不能再被赋值而输出了,所以是禁止赋常量值的,比如''也是常量值,也不可以赋给这两种类型的变量,如果不能把存储过程中的其他变量赋给 ...

  7. Scala详细环境安装与配置

    https://blog.csdn.net/free356/article/details/72911898 系统为windows.安装配置Scala如下: 一,安装Scala 1,java6以上(建 ...

  8. 老男孩Day15作业:商城列表页面(静态)

    一. 一.作业需求: 1.完成商城列表静态页面的抒写 二.博客地址:https://www.cnblogs.com/catepython/p/9205636.html 三.运行环境 操作系统:Win1 ...

  9. SDUT OJ 数据结构实验之链表三:链表的逆置

    数据结构实验之链表三:链表的逆置 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  10. 实现bootstrap的dropdown-menu(下拉菜单)点击后不关闭的方法 (转)

    实现bootstrap的dropdown-menu(下拉菜单)点击后不关闭的方法 问题描述,在下拉菜单中,添加其他元素,例如,原文作者所述的<a>和我自己实际用到的<input> ...