HZAU 18——Array C——————【贪心】

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≤CiAi(1≤in)

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;
}

  

时间: 2024-10-06 17:03:27

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

Codeforces 442C Artem and Array(stack+贪心)

题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数,删除一个数的得分为两边数的最小值,如果左右有一边不存在则算作0分.问最大得分是多少. 解题思路:首先将连续的a,b,c,a > b && c > b的情况将c掉,获得min(a,b)分,这样处理后数组变成一个递増再递减的序列,除了最大和第二大的取不到,其他数字均可以得分. 样例:4 10 2 2 8 #include <cstdio> #include

hzau 1209 Deadline(贪心)

K.Deadline There are N bugs to be repaired and some engineers whose abilities are roughly equal. And an engineer can repair a bug per day. Each bug has a deadline A[i]. Question: How many engineers can repair all bugs before those deadlines at least?

Codeforces 402D Upgrading Array:贪心 + 数学

题目链接:http://codeforces.com/problemset/problem/402/D 题意: 给你一个长度为n的数列a[i],又给出了m个“坏质数”b[i]. 定义函数f(s),其中p是s的最小质因子: f(1) = 0 f(s) = f(s/p) + 1 (p不是坏质数) f(s) = f(s/p) - 1 (p是坏质数) 你可以任意次数地进行操作:给a[1 to i]的每个数都除以gcd(a[1 to i]). 问你 ∑ f(a[i)最大为多少. 题解: 函数f(s)的实际

JavaSE学习总结第18天_集合框架4

18.01 Map集合概述和特点 Map接口概述:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值 Map接口和Collection接口的不同 1.Map是双列的,Collection是单列的 2.Map的键唯一,Collection的子体系Set是唯一的 3.Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效 18.02 Map集合的功能概述 成员方法: 1.V put(K key,V value): 将指定的值与此映射中的指定

PHP中的数组(Array)

定义数组的方式: 使用array内置关键字 使用[]定义 直接赋值 <?phpecho '<pre>'; //定义数组的方式////1.使用array内置关键字$arr = array(1,2,4);print_r($arr); //2.使用[]定义$brr = [1,2,4];print_r($brr); //3.直接赋值$crr[] = 1;$crr[] = 2;$crr[] = 4; print_r($crr); $drr[1] = 1;$drr[2] = 2;$drr[3] = 

php 多维数组 array sort 排序 :array_multisort

1.参考链接: php简单实现多维数组排序的方法 参考二: 这个链接很好,可以直接看这个:PHP array_multisort-对多个数组或多维数组进行排序 2.案例一: 1 //13: 最佳: 2 public function zjService() 3 { 4 //小组得分: 5 $team = array(); 6 //学生得分: 7 $student = array(); 8 9 //取出所有的小组: 10 $TeamModel = new TeamModel(); 11 $wher

poj 1017(贪心)

[题目大意] 题目大意是这样的:某工厂生产几种产品,首先用packet包住,这些产品的高度都是h,底面积有1*1,2*2,3*3,4*4,5*5,6*6六种规格,下面我们要用高度为h,底面积为6*6的集装箱装这些货物,问怎样使所用集装箱数目最少? [解题思路] 我们首先必须先装底面积大的货物,并且对于面积为4*4,5*5,6*6的货物,每一件都需要一个独立的集装箱.对于底面积为3*3的货物,每四个需要一个集装箱. 那么我们可以得知对于装了底面积为3*3的货物的集装箱,其剩余可以装5,3,1个底面

javascript 中Array一些高效的操作方法

Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例. console.log(Array.from('foo')); // expected output: Array ["f", "o", "o"] console.log(Array.from([1, 2, 3], x => x + x)); // expected output: Array [2, 4, 6] Array.isArray() 用于确定传递的

排序算法三:堆排序(Heapsort)

堆排序(Heapsort)是一种利用数据结构中的堆进行排序的算法,分为构建初始堆,减小堆的元素个数,调整堆共3步. (一)算法实现 1 protected void sort(int[] toSort) { 2 buildHeap(toSort); 3 for (int i = toSort.length - 1; i > 0; i--) { 4 CommonUtils.swap(toSort, 0, i); 5 adjustHeap(toSort, 0, i); 6 } 7 } 8 9 /**