学渣的逆袭

Description

老师在黑板上写了四个数列a,b,c,d,数列a,b,c,d分别有i,j,k,l个数,突然间老师很生气的把正在睡觉的豆子喊了起来,问:“这是你第x次上课睡觉了!现在给你个赎罪的机会,你从每个数列中选择一个数,有多少种选法使他们的和为x?”,豆子实在太慌乱了,小伙伴们能告诉豆子正确答案吗?
Input

第一行有四个整数i,j,k,l(1<=i,j,k,l<=500),第二行有i个数a1,a2...ai,第三行有j个数b1,b2...bj,第四行有k个数c1,c2...ck,第五行有l个数d1,d2...dl。第六行有一个数m,接下来m行询问,每行有一个数字x。(m<=10),(|x|<10^10),(|a|,|b|,|c|,|d|<=10^8)
Output

输出有m行,每行输出一个x对应的答案。
Sample Input
2 2 2 2
1 2
3 4
5 6
7 8
3
7
16
17
Sample Output
0
1
4
HINT

时间给了3s,还是挺多的,枚举+二分就可以了。

写了三个,一直在优化时间最后终于优化到1s以内了O(∩_∩)O~~。

第一个1800ms。。

#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int oo = 0x3f3f3f3f;
const int maxn = 1e4+7;
const int mod = 998244353;
typedef long long LL;
int a[maxn], b[maxn], c[maxn], d[maxn];
LL ans;
int main()
{
    int i, j, q, w, e, r, m, x, k;
    while(~scanf("%d %d %d %d", &q, &w, &e, &r))
    {
        ans = 0;
        for(i = 0; i < q; i ++) scanf("%d", &a[i]);
        for(i = 0; i < w; i++)scanf("%d", &b[i]);
        for(i = 0; i < e; i++) scanf("%d", &c[i]);
        for(i = 0; i < r; i++)scanf("%d", &d[i]);
        sort(a, a+q); sort(b, b+w);
        sort(c, c+e); sort(d, d+r);
        scanf("%d", &m);
        while(m--)
        {
            scanf("%d", &x);
            ans = 0;
            for(i = 0; i < q; i ++)
            {
                if(a[i] > x) break;
                for(j = 0; j < w; j ++)
                {
                    if(a[i]+b[j] > x) break;
                    for(k = 0; k < e; k++)
                    {
                        if(a[i]+b[j]+c[k] > x) break;
                        int v = x-a[i]-b[j]-c[k];
                        if(binary_search(d, d+r, v))ans++;
                    }
                }
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}

/**************************************************************
    Problem: 1785
    User: 2759894160
    Language: C++
    Result: Accepted
    Time:1858 ms
    Memory:1032 kb
****************************************************************/

第二个 1600ms。。 只少了200不过聊胜于无,

#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int oo = 0x3f3f3f3f;
const int maxn = 1e4+7;
const int mod = 998244353;
typedef long long LL;
int a[maxn], b[maxn], c[maxn], d[maxn];
LL ans;
void init(int &m, int o[], int n, int val)
{
    m = lower_bound(o, o+n, val)-o;
    if(o[m] > val || m == n) m--;
}
int main()
{
    int i, j, q, w, e, r, m, x, k;
    int z, s, v;
    while(~scanf("%d %d %d %d", &q, &w, &e, &r))
    {
        for(i = 0; i < q; i ++) scanf("%d", &a[i]);
        for(i = 0; i < w; i++)scanf("%d", &b[i]);
        for(i = 0; i < e; i++) scanf("%d", &c[i]);
        for(i = 0; i < r; i++)scanf("%d", &d[i]);
        sort(a, a+q); sort(b, b+w);
        sort(c, c+e); sort(d, d+r);
        scanf("%d", &m);
        while(m--)
        {
            scanf("%d", &x);
            ans = 0;
           init(z, a, q, x); init(s, b, w, x); init(v, c, e, x);
            for(i = 0; i <= z; i ++)
            {
                if(a[i] > x) break;
                for(j = 0; j <= s; j ++)
                {
                    if(a[i]+b[j] > x) break;
                    for(k = 0; k <= v; k++)
                    {
                        if(a[i]+b[j]+c[k] > x) break;
                        int v = x-a[i]-b[j]-c[k];
                        if(binary_search(d, d+r, v))ans++;
                    }
                }
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}

/**************************************************************
    Problem: 1785
    User: 2759894160
    Language: C++
    Result: Accepted
    Time:1667 ms
    Memory:1032 kb
****************************************************************/

第三个, 本来把后三个数组的所有和放到了一个新的数组里面, 不过500*500*500太大, 于是计划破产, 就放了2个500*500  500*500的。。(700ms 优雅的暴力)

#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int oo = 0x3f3f3f3f;
const int maxn = 1e6+7;
const int mod = 998244353;
typedef long long LL;
int a[maxn], b[maxn], c[maxn], d[maxn];
int fir[maxn], sec[maxn];
LL ans;
int main()
{
    int i, j, q, w, e, r, m, x, k, cnt, cnt1;
    while(~scanf("%d %d %d %d", &q, &w, &e, &r))
    {
        cnt = cnt1 = ans = 0;
        for(i = 0; i < q; i ++) scanf("%d", &a[i]);
        for(i = 0; i < w; i++)scanf("%d", &b[i]);
        for(i = 0; i < e; i++) scanf("%d", &c[i]);
        for(i = 0; i < r; i++)scanf("%d", &d[i]);
        for(i = 0; i < q; i++)
            for(j = 0; j < w; j++)
                fir[cnt++] = a[i]+b[j];
        for(i = 0; i < e; i++)
            for(j = 0; j < r; j++)
            sec[cnt1++] = c[i]+d[j];
        sort(fir, fir+cnt); sort(sec, sec+cnt1);
        scanf("%d", &m);
        while(m--)
        {
            scanf("%d", &x);
            ans = 0;
            for(i = 0; i < cnt; i++)
            {
                int v = x-fir[i];
                int l, r;
                if(binary_search(sec, sec+cnt1, v))
                {
                    l = lower_bound(sec, sec+cnt1, v)-sec;
                    r = upper_bound(sec, sec+cnt1, v)-sec;
                    ans += r-l;
                }
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}

/**************************************************************
    Problem: 1785
    User: 2759894160
    Language: C++
    Result: Accepted
    Time:704 ms
    Memory:24312 kb
****************************************************************/
时间: 2024-11-01 06:51:20

学渣的逆袭的相关文章

云电脑玩游戏学渣逆袭为学霸——新睿云云电脑,有点意思!

我个人总有这种感觉,今年买的爆款电脑,可能明年就已经成为"老年机"了.当然我说的可能略微夸大,但电脑硬件的更新速度已经远远超出我个人钱包里钞票的积攒的速度.作为一个硬件发烧友,我一直以来都紧跟时代的潮流,后来我放弃了.实在是买不起了,归根到底,就是一个字--穷 我们这文不是鸡汤,不讲人生哲学,作为一个真真切切喜爱游戏的发烧友,这里就就事论事的探讨一下 .把我个人的所见所得,给大家分享一下. 这个概念我很早以前就知道了 ,不过碍于技术很多年没有实现.后来知道是国内达龙云的一家做云电脑的公

高中学渣逆袭入“大学”:如今月收入达五位数

互联网的发展,改变了很多人的命运.也许是机遇.也许是痛苦后的觉醒和奋斗,才使宝宝对生活.对命运有了更加清晰的认识.今天是一个特别的日子,高考,那年,宝宝带着紧张的心情走进考场,谁也不知道十年后的自己将会是什么样子?人生的路一片迷茫,无助,无奈,只因为宝宝是贫困家庭的儿子,父母没有背景.今后的路,全凭自己一个人走. 2005年宝宝的照片 文/辛东方,80后作家.专栏作者.专注互联网科技领域 一些励志的名言,其实一直鼓励着宝宝成长,至今记得,不敢忘记.王国维<人间词话>中说古今之成大事业.大学问者

京东上市后首次盈利 品质电商成逆袭最大功臣

文/张书乐 据媒体报道,10日晚间,京东集团(Nasdaq:JD)发布2016财年第二季度业绩.让人颇为意外的是,经历618大促一片激烈厮杀过后,京东的净利润水平不降反升,非美国通用会计准则下(Non-GAAP)净利润达到3.914亿元人民币,去年同期为亏损1570万元:美国通用会计准则下(GAAP)下净亏损1.321亿元,较去年同期净亏损5.104亿元大幅收窄,超出华尔街的预期. 如果按GAAP的标准,则京东在2016年第二季度,实现了上市以来的首次盈利.这也是京东的对标企业亚马逊盈利之后,一

电子商务知识精华,屌丝完美逆袭!(转)

电子商务知识精华,屌丝完美逆袭! 何为电子商务? 电子商务源于英文ELECTRONIC COMMERCE,简写为EC.顾名思义,其内容包含两方面,一是电子方式,二是商贸活动.指商务活动的电子化.网络化,通过Internet的技术或各种商务网络平台,完成商务交易,获得产品和服务. 1)        优点:品种齐全,种类繁多,一站购物,电子支付,市场全球化,全天候服务,成本低廉化(营销.店铺大小,地理位置.生产商直销等),减少人力物力,网络代购(国外独有品牌.国外价格优势.新鲜好玩),价格比较,网

三星利润狂降是国产手机的成功逆袭

作为唯一能与苹果iPhone相抗衡的手机厂商--三星,因受到中国大陆手机厂商为代表的新兴势力快速崛起的威胁,最近被部分网友感叹为"明日黄花".而他们认为的会造成此结果的证据就是如今急剧下滑的运营利润.面对突如其来的危机,从现今看三星几乎没找到更好的补救措施,甚至眼睁睁地错失4G浪潮之始的绝佳机会.在残酷的智能手机市场,一步错,就可能步步错.三星会不会不奋起直追?又或者和当年洋品牌彩电一样被逐出大陆市场. 利润狂降 三星后劲不足 冰冻三尺非一日之寒,三星运营利润狂降早就有了苗头.早在4月

恭喜Yeslab(上海)郑同学于北京一次PASS RS CCIE,有句话叫做“逆袭未来”!

恭喜Yeslab(上海)郑同学于北京一次PASS RS CCIE,有句话叫做"逆袭未来"! 但还请记住,逆袭者仅仅留给有准备的人 恭喜Yeslab(上海)郑同学于北京一次PASS RS CCIE,有句话叫做"逆袭未来"!,布布扣,bubuko.com

如果35岁破产,还有多大可能逆袭?

最近在知乎上看到一个很有趣的问题:房间里有100个人,每人都有100元钱,他们在玩一个游戏.每轮游戏中,每个人都要拿出一元钱随机给另一个人,最后这100个人的财富分布是怎样的? 以下是三个不同的答案,请投票 我们不妨把这场游戏视作社会财富分配的简化模型,从而模拟这个世界的运行规律.我们假设:每个人在18岁带着100元的初始资金开始玩游戏,每天玩一次,一直玩到65岁退休."每天拿出一元钱"可理解为基本的日常消费,"获得财富的概率随机"是为了--嗯--简化模型.以此计算

XidianOJ 1029 数一的逆袭

题目描述 数一是一个穷屌丝兼程序猿,是社会受剥削的底层人物,但是他有一个梦想,就是博得女神的欢心.这天,数一的女神说:"一直活在二次元的屌丝啊,一直活在二进制的程序猿啊,你们这群二货快告诉我这堆2是怎么回事?"女神已经被2的幂次搞晕过去了,她只是想知道2的n次方的最高位和最低位是多少,你能帮数一逆袭女神吗? 输入 第一行首先是一个正整数T(T<=100)接下来是T行,每行代表一组数据,每组数据仅有一个正整数n(n<=100000) 输出 对于每组数据,输出两个整数,以空格分

逆袭指数---杭电校赛(暴力搜索)

Problem Description 这依然是关于高富帅小明曾经的故事—— 尽管身处逆境,但小明一直没有放弃努力,除了搬砖,小明还研究过东方的八卦以及西方的星座,一直试图在命理上找到自己能够逆袭的依据. 当这些都失败以后,小明转向了数学研究,希望从中得到一些信息.一天,小明在研究<BestCoder逆袭的数理基础>这本书时,发现了宝贵的信息,其中写道:  每个人都存在一个逆袭指数,对于这个逆袭指数,可能存在连续的因子,如果这个连续因子足够长的话,那么这个人逆袭的概率就很大! 小明已知自己的逆