【深入浅出程序设计竞赛】:珠心算测验、爱与愁的心痛

277 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情

[NOIP2014 普及组] 珠心算测验

题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

(本题目为 2014NOIP 普及 T1)

输入格式

共两行,第一行包含一个整数 nn,表示测试题中给出的正整数个数。

第二行有 nn 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式

一个整数,表示测验题答案。

样例 #1

样例输入 #1

4
1 2 3 4

样例输出 #1

2

提示

【样例说明】

1+2=3,1+3=41+2=3,1+3=4,故满足测试要求的答案为 22

注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

对于 100%100\% 的数据,3n1003 \leq n \leq 100,测验题给出的正整数大小不超过 10,00010,000

解题

#include<bits/stdc++.h>
using namespace std;
set<int> num;
set<int> ans;
int a[110];
int main() {
    int n;
    cin >> n;
    for(int i = 0; i<n; i++) {
        cin >> a[i];
        num.insert(a[i]);
    }
    for(int i = 0; i<n; i++) {
        for(int j = i+1; j<n; j++) {
            int res = a[i]+a[j];
            set<int>::iterator it = num.find(res);
            if(it != num.end()) {
            ans.insert(*it);
            }
        }
    }
    cout << ans.size();
    return 0;
}

爱与愁的心痛

题目背景

(本道题目隐藏了两首歌名,找找看哪~)

《爱与愁的故事第一弹·heartache》第一章。

《我为歌狂》当中伍思凯神曲《舞月光》居然没赢给萨顶顶,爱与愁大神心痛啊,而且最近还有一些令人伤心的事情,都让人心痛(最近真的很烦哈)

题目描述

最近有 nn 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 mm 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。

输入格式

第一行有两个用空格隔开的整数,分别代表 nnmm

22 到第 (n+1)(n + 1) 行,每行一个整数,第 (i+1)(i + 1) 行的整数 aia_i 代表第 ii 件事的刺痛值 aia_i

输出格式

输出一行一个整数,表示连续 mm 个刺痛值的和的最小值是多少。

样例 #1

样例输入 #1

8 3
1
4
7
3
1
2
4
3

样例输出 #1

6

提示

数据规模与约定

  • 对于 30%30\% 的数据,保证 n20n \leq 20
  • 对于 60%60\% 的数据,保证 n100n \leq 100
  • 对于 90%90\% 的数据,保证 n103n \leq 10^3
  • 对于 100%100\% 的数据,保证 0mn3×1030 \leq m \leq n \leq 3 \times 10^31ai1001 \leq a_i \leq 100

解题

#include<bits/stdc++.h>
using namespace std;
vector<int> a;
int minV = 1000000;
int main() {
    int n, m;
    cin >> n >> m;
    int v;
    for(int i = 0; i<n; i++) {
        cin >> v;
        a.push_back(v);
    }
    while(a.size() >= m) {
        int sum = 0;
        for(int i = 0; i<m; i++) {
            sum += a[i];
        }
        minV = min(sum, minV);
        a.erase(a.begin());
    }
    cout << minV;
    return 0;
}