一个西电的ACM竞赛题想到的 part1

题目如下:

输出结果如下:

上述题目看起来需要用到动态规划的知识。 采用动态规划设计算法的话, 算法的时间复杂度估计是很有效的。 但是由于本人对动态规划的理解还处于探索阶段, 所以没有用。 而是选择了一个时间复杂度为O(n^3), 空间复杂度为O(1)简单地算法。步骤如下:

(1)排好序

(2)需要三个指针, 一个指向mid, 一个指向mid 的左边high, 一个指向mid 的右边low。 high 被初始化为mid  + 1, low 被初始化为mid.

(3) 固定mid 在一个fixed value, 为 第二个元素(mid 的移动空间为第二个元素到倒数第二个元素)。

(4)对于每一个固定的元素, 开始对low 循环, 循环的范围为mid到第一个元素。

(4)对于每一个固定的low, 都需要对high 进行循环, 大于MAX, 计数就加一。

(5)直至所有的循环结束。

首先, 输入我是存放在D:\\sample.txt 文件夹下面:

程序如下:

在code::blocks 下创建工程文件, 主程序文件如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

void Count(vector<int> &myVec, int &Total, int Max);

int main()
{
    int number;
    string filePath;
    int numberOfInstances;
    int Max;
    int Rings;
    cout << "please input your file path: " ; //ie, D:\\sample

    cin >> filePath;

    ifstream fin;

    fin.open(filePath.c_str());
    if(fin.fail()) {
        cout << "sorry, fail to open" << endl;
        exit(1);
    }

    fin >> numberOfInstances;

    vector<int> vect1;

   for(int i = 0; i < numberOfInstances; i++) {
        fin >> Rings;
        fin >> Max;
        for(int i = 0; i < Rings; i++) {
            fin >> number;
            vect1.push_back(number);
        }
        int totalCount = 0;

        Count(vect1, totalCount, Max);
        cout << totalCount << endl;

        vect1.clear();
        }
    fin.close();
    return 0;
}

void Count(vector<int> &myVec, int & Total, int Max) {
    sort(myVec.begin(), myVec.end());
    vector<int>::iterator mid;
    vector<int>::iterator low;
    vector<int>::iterator high;

    for(mid = myVec.begin() + 1; mid != myVec.end() -1 ; mid++) {
        high = mid + 1; // ie, high is always in the right of mid
        low = mid;
        while(low != myVec.begin()) {
            low--;
            for(high = mid + 1; high != myVec.end(); high++) {
                if(*low + *mid + *high >= Max) {
                    Total++;
                }
            }
        }
    }
}

运行结果如下:

时间: 2024-11-07 06:39:55

一个西电的ACM竞赛题想到的 part1的相关文章

第九届西电ACM校赛解答

Description 欢迎参加西电第九届ACM校内赛!作为一名经历了四届校赛的ACM老队员以及本次校赛的出题人,每次校赛都让我有一种全新的感受--有第一次参加校赛时提交代码时紧张到双手发抖,也有当裁判时看到有些不明真相的人提交编译后程序时的欢乐.不管你是第几次参赛,好好享受这一刻带给你的各种感受,经历就是一种财富.为了让大家更好地记住这悲喜交加的日子,特意准备了这么一道题: 给你一个日期,你只要输出这个日期是在校赛前还是校赛后,或者刚好就是校赛那一天(2011年5月22号). 题目是什么意思呢

我看西电通院月考——学生应该做点什么?

如果你没有耐心看完整篇文章,你可以直接跳到最后一点,看看对于类似通院月考这样让你很郁闷的抓学风政策,我所认为的学生应该怎么做,也是我主要想传达的想法. 1.大学月考政策介绍 前段时间听说西电通院一些年级开始实行月考制度,每门课都要月考:一次考试低于50就算挂科:月考均分低于60也算挂科:月考时间不固定,随机进行通知.也听说指纹签到机的使用,还有不遵守校规,直接宿舍断电断水的事,具体没有去做考证.我不知道这个月考制度后来具体是怎么实施的,实施是否严格,又是否有效. 对于这项政策,有人举双手表示赞同

西电保外攻略之我见

自从保外确定以后就一直想找个机会,向学弟学妹们解读一下今年保研的新政策以及自己在保研过程中所获得的经验.但考虑到保外大师@黄代炜尚在西电,人家不发话我也不好意思赶在大师前头动笔是不?怎奈时光荏苒,2014年高校推免工作已经接近尾声,黄大师却始终毫无动静.佛云“我不下地狱,谁下地狱”,事已至此,只得勉力提笔,将自己对保研过程中的思考写在这里,希望能帮助到未来有志于保外的学弟学妹们.我说的这些主要针对计算机&软件工程专业的学生,其他专业的仅供参考. =========================

西电oj 6月月赛

西电oj 6月月赛 最近确实比较累,加上天气很热,宿舍一群人在打游戏,同时由于本身自己思维题做的不多,所以这次月赛自然而然的被虐了. 不过还是写写总结,顺便留坑以后补题解. A题,水题,但最近手速慢下来了,得多做题了. B题,水题,虽然题面看半天没懂,交了两次WA之后还是过了,看错题对手速狗来说是绝对不允许出现的,WA也不应该在能做的题出现. C题,这题很多人过了.这次没做出来只能说是运气不好,这种题做出来算自己运气好,做不出来算运气不好.这次这道题是用总情况减去掉异构的情况,最后得到答案,奇数

西电oj 1058 图论,贪心

西电oj 1058 图论,贪心 1058: 找子图 时间限制: 1 Sec  内存限制: 128 MB提交: 15  解决: 11[提交][状态][讨论版] 题目描述 现有一张无向图,有n个点m条边,每条边都有一个权值w,现要求从中找出一个子图,这个子图需满足以下特征:1.子图可以为空.2.若某条边的两个端点都在此子图中,则这条边在这个子图中.3.若某条边的两个端点都不在此子图中,则这条边在这个子图外.4.若某条边的两个端点一个在子图中,另一个不在,则这条边消失.5.子图中所有边权值的和减去子图

西电oj 1038 状压dp

西电oj 1038  状压dp 1038: 裁玻璃 时间限制: 1 Sec  内存限制: 128 MB提交: 33  解决: 4[提交][状态][讨论版] 题目描述 张老板的玻璃店开张了,生意火爆.今天,隔壁玻璃店的刘老板拿来一块玻璃,意在刁难张老板.刘老板说:“我这块玻璃是由N(行)*M(列)小正方形玻璃拼成的,但是其中有一些玻璃坏了,我希望你现在把它裁成尽量多的2*2的小玻璃,而且这些小玻璃都不能有坏的地方.如果你裁出来的块数不是最多的,我就把你赶出建材市场.”现在,张老板来拜托你帮他解决这

西电Online Judge 1007

Description 一天,wm和zyf想比比谁比较正气,但正气这种东西无法量化难以比较,为此,他们想出了一个方法,两人各写一个数字,然后转化为二进制,谁的数字中二进制1多谁就比较正气! Input 输入包含多组数据,EOF结束.  每组数据包含两行,代表两个非负整数a,b(0<=a,b<10^100,不含前导0),a为wm写的数字,b为zyf写的数字. Output 每组数据输出一行,输出正气的西电人名字"wm"或"zyf",如果两人的数字中二进制1

杭电 HDU ACM 1025 Constructing Roads In JGShining&#39;s Kingdom

Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17732    Accepted Submission(s): 5023 Problem Description JGShining's kingdom consists of 2n(n is no mo

西电oj1037 字符串

西电oj1037 字符串 1037: 倍流畅序列 时间限制: 1 Sec  内存限制: 128 MB提交: 34  解决: 9[提交][状态][讨论版] 题目描述 对于一个0.1串s, 从左端开始读取它的0获得序列s0,从右端开始读取它的1获得s1,如果s1与s2同构,则称s为倍流畅序列.例如:011001是一个倍流畅序列, 因为:s0 = 0__00_s1 = 1__11_ 而101不是, 因为:s0 = _0_s1 = 1_1 下面的问题是:对于一个0.1串s, 在s后添加最少数目的0或1,