华农校赛--G,用set比较大小,缩短时间复杂度

Array C

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 581  Solved: 101
[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.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
struct Node
{
    long long a;
    long long b;
    long long c;
    long long num;
    int i;
    bool operator < (const Node& t)const
    {
        return ((num>t.num)|| (num==t.num&&a<t.a)|| (num==t.num&&a==t.a&&b<t.b)||(num==t.num&&a==t.a&&b==t.b&&c<t.c)||(num==t.num&&a==t.a&&b==t.b&&c==t.c&&i<t.i));
    }

} node[1005];
set<Node>s;

int main()
{
    int n,m;

    while(scanf("%d%d",&n,&m)!=EOF)
    {
        long long res=0;
        long long sum=0;
        s.clear();
        for(int i=0; i<n; i++)
            scanf("%I64d",&node[i].a);
        for(int i=0; i<n; i++)
            scanf("%I64d",&node[i].b);
        for(int i=0; i<n; i++)
        {
            node[i].i=i;
            node[i].c=node[i].a;
            node[i].num=(2*node[i].c-1)*node[i].b;
            res+=node[i].c*node[i].c*node[i].b;
            sum+=node[i].a;
            s.insert(node[i]);
        }
        // cout<<res<<endl;
        Node tmp;
        set<Node>::iterator iter;
        for(int i=sum; i>m; i--)
        {
           // for(iter=s.begin(); iter!=s.end(); iter++)
               // cout<<iter->num<<"  ";
            tmp=(*s.begin());
            //cout<<tmp.num<<"***"<<res<<endl;

            s.erase(tmp);
            res-=tmp.num;
            tmp.c-=1;
            //out<<tmp.a<<endl;
            tmp.num=(2*tmp.c-1)*tmp.b;
            s.insert(tmp);

            //cout<<endl;

        }
        printf("%lld\n",res);

    }
    return 0;
}

时间: 2024-10-03 23:48:59

华农校赛--G,用set比较大小,缩短时间复杂度的相关文章

2016华农校赛

题A 题意:要发明信片,有n个人,选其中的k个人来发,但是有一个规定,就是选了a的话,如果a和b关系好的,b也要寄给,所以给出m对关系好的,让你随机选k个人,求最后要发给的人数的期望,为了不输出浮点数,就将结果乘以C(n,k): 题解:期望题一般都是考虑各种情况,把所有情况都考虑清晰之后,将数加起来平均一下就可以得出答案.考虑一个人,如果选了他,那么C(n,k)中有多少种情况会导致选这个人呢?假设这个人的前面有cnt个人,也就是只要选了这cnt个人的其中一个的话,那么就会选到这个人,然后共有C(

2015北京网络赛 G Boxes BFS+打表

G Boxes 题意:n个位置摆有n个箱子,每次移动只能把相邻的垒起来,且上面的必须小于下面的.求摆成升序需要移动多少步. 思路:这里的n很小,只有7.但是bfs最快的情况需要2s左右,所以就打表了. 诡异的是n = 6时居然都跑不出来都超时,连6也打了个表. 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <

2016年省赛G题, Parenthesis

Problem G: Parenthesis Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 398  Solved: 75[Submit][Status][Web Board] Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-th question is whether P remains balan

【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle

题意:给你三个半径相同的圆,它们切在一起,然后让你往缝里一个一个地塞圆,问你塞到第k个的半径是多少. 就把上面那两个圆的切点当成反演中心,然后会反演成这个样子,两个平行直线和一个圆. 然后就是往那个圆上面再塞圆,然后反演回去算面积就行了. #include<cstdio> #include<cmath> using namespace std; const double pi=3.14159; int n,K; double R,anss[12]; int main(){ //fr

华中农业大学第四届程序设计大赛网络同步赛 G.Array C 线段树或者优先队列

Problem G: Array C Time Limit: 1 Sec  Memory Limit: 128 MB 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 min

2015安徽省赛 G.你来擒孟获

http://xcacm.hfut.edu.cn/problem.php?id=1211 SPFA模板题目 最短路变种,从起点终点各找一次最短路相加 #include<iostream> #include<vector> #include<deque> #include<cstdio> #include<cstring> using namespace std; struct Edge { int to,length; }; bool spfa(

hihocode 1584 : Bounce (找规律)(2017 北京网络赛G)

题目链接 比赛时随便找了个规律,然后队友过了.不过那个规律具体细节还挺烦的.刚刚偶然看到Q巨在群里提到的他的一个思路,妙啊,很好理解,而且公式写起来也容易.OrzQ巨 #include<bits/stdc++.h> using namespace std; typedef long long LL; LL n,m; int main() { while(~scanf("%lld%lld",&n,&m)) { n--,m--; LL g=__gcd(n,m);

2018icpc南京现场赛-G Pyramid(打标找规律+逆元)

题意: 求n行三角形中等边三角形个数,图二的三角形也算. n<=1e9 思路: 打表找下规律,打表方法:把所有点扔坐标系里n^3爆搜即可 打出来为 1,5,15,35,70,126,210.. 没感觉,作差 4, 10, 20, 35, 56, 84 还是没感觉,作差 6, 10, 15, 21, 28 发现此时的差递增1?也就是再作差4, 5, 6, 7是等差数列 也就是再作差1, 1, 1为常数 相当于函数$A_n$求四次导为常数!(如果他是个连续函数的话) 于是我们设$\displayst

2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛)-G(DP)

题目链接:https://ac.nowcoder.com/acm/contest/553/G 题意:给定n,k,(1<=n<=5e5)然后给出n个数ai(1<=ai<=1e5),问按顺序从1..n分组,最多能有多少个组的异或和为k. 思路:自然的,我们用dp[i]表示到第i个人的时候最多有多少个组的异或和为k.计算dp[i]时,有两种情况,要么在第i个人后面分出一组,要么不分.不分的话dp[i]=dp[i-1]就可以了; 如果分得话,就要找到上一个组的终点下标,我们可以计算到第i个