洛谷-官方题单版【入门篇】

文章目录

【入门1】顺序结构

P1000 超级玛丽游戏

题目背景
本题是洛谷的试机题目,可以帮助了解洛谷的使用。

建议完成本题目后继续尝试 P1001、P1008。

另外强烈推荐新用户必读贴

题目描述
超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。

           ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###            ###
                ...........               #...#          #...#
               ##*#######                 #.#.#          #.#.#
            ####*******######             #.#.#          #.#.#
           ...#***.****.*###....          #...#          #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############
#include<bits/stdc++.h>

int main() 
{
    
    
    printf(
    "                ********\n"
    "               ************\n"
    "               ####....#.\n"
    "             #..###.....##....\n"
    "             ###.......######              ###            ###\n"
    "                ...........               #...#          #...#\n"
    "               ##*#######                 #.#.#          #.#.#\n"
    "            ####*******######             #.#.#          #.#.#\n"
    "           ...#***.****.*###....          #...#          #...#\n"
    "           ....**********##.....           ###            ###\n"
    "           ....****    *****....\n"
    "             ####        ####\n"
    "           ######        ######\n"
    "##############################################################\n"
    "#...#......#.##...#......#.##...#......#.##------------------#\n"
    "###########################################------------------#\n"
    "#..#....#....##..#....#....##..#....#....#####################\n"
    "##########################################    #----------#\n"
    "#.....#......##.....#......##.....#......#    #----------#\n"
    "##########################################    #----------#\n"
    "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n"
    "##########################################    ############\n"
    );
    return 0;
}

*P5704 【深基2.例6】字母转换

题目描述
输入一个小写字母,输出其对应的大写字母。例如输入 q[回车] 时,会输出 Q。

输入格式

输出格式

输入输出样例
输入 #1复制
q
输出 #1复制
Q

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    char c;
    cin >> c;
    // cout << char(c - 32) << endl;
    // putchar(toupper(c));
    //putchar输出一个字符(相当于强制转换char,toupper则是将小写字母大写对应ASCII码输出出来
    putchar(c - 'a' + 'A'); //偏移量 + 基数
    // putchar(getchar()- 'a' + 'A');  超简
}

P5705 【深基2.例7】数字反转

题目描述
输入一个不小于 100 且小于 1000,同时包括小数点后一位的一个浮点数,例如 123.4 ,要求把这个数字翻转过来,变成 4.321 并输出。

扫描二维码关注公众号,回复: 14713578 查看本文章

输入格式
一行一个浮点数

输出格式
一行一个浮点数

输入输出样例
输入 #1复制
123.4
输出 #1复制
4.321

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    string s;
    cin >> s;
    int len = s.size();
    if(s.back() == '0') s.pop_back();
    reverse(s.begin(), s.end());
    
    cout << s << endl;
    return 0;
}

题目描述
学校和 yyy 的家之间的距离为 s 米,而 yyy 以 v 米每分钟的速度匀速走向学校。

在上学的路上,yyy 还要额外花费 10分钟的时间进行垃圾分类。

学校要求必须在上午 8:00 \textrm{8:00} 8:00到达,请计算在不迟到的前提下,yyy 最晚能什么时候出门。

由于路途遥远,yyy 可能不得不提前一点出发,但是提前的时间不会超过一天。

输入格式
一行两个正整数 s,v分别代表路程和速度。

输出格式
输出一个 24 小时制下的时间,代表 yyy 最晚的出发时间。

输出格式为 HH:MM \texttt{HH:MM} HH:MM,分别代表该时间的时和分。必须输出两位,不足前面补 00。

输入输出样例
输入 #1复制
100 99
输出 #1复制
07:48
说明/提示
对于 100 % 100\% 100% 的数据, 1 ≤ s , v ≤ 1 0 4 1 \le s,v \le 10^4 1s,v104

只过了70%

// 由于s与v中的时间单位为分,所以我们直接将8小时换算成分钟(直接8*60好了)。

// 由于时间可能大于11天,我们在求出来的分钟数中加上24*60。

// 当我们把该时间减去行走时间和垃圾分类后,判断剩下的时间是否大于一天,如果大于一天就减去一天的时间,但你必须向上取整,不然行走时间就会少。

// 将剩下的时间除以60得到出发时。将剩下的时间对60取余得出发分。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int s, v; 
    scanf("%d%d", &s, &v);
    
    int ahead = ceil(s / v);  //向上取整!!! 
    if(s % v != 0) ahead += 1; 
    
    //8点 :   08:00   8 * 60 - ahead - 10 再转化为时间表示   
    int m = 8 * 60;
    int new_m = 480 - ahead - 10;
    
    int h = new_m / 60;
    int mm = new_m % 60; 
            
    printf("%02d:%02d", h, mm);
    
    return 0;
}

P1425 小鱼的游泳时间

题目描述
伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。

这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按 24 小时制计算),它发现自己从 a 时 b 分一直游泳到当天的 c 时 d 分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

小鱼游的好辛苦呀,你可不要算错了哦。

输入格式
一行内输入 4 个整数,以空格隔开,分别表示题目中的 a, b, c, d。

输出格式
一行内输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f应该小于 60。

输入输出样例
输入 #1复制
12 50 19 10
输出 #1复制
6 20

#include<bits/stdc++.h>

using namespace std;
    
int main()
{
    
    
    int a, b, c, d;
    scanf("%d%d%d%d", &a, &b, &c, &d);
    int e = c - a, f = (d - b + 60) % 60;
    if(b > d) e --;// 如 1:30 -- 2 : 20   不到一小时【小时需减去1】 
    printf("%d %d", e, f);
        
    return 0;
}

直接进制转换分钟【不用考虑特殊情况:一天内任何时候都满足】

#include<cstdio>
using namespace std;
int main()
{
    
    
	int a,b,c,d;
	scanf("%d %d %d %d",&a,&b,&c,&d);
	int e=(c - a) * 60 + d - b; //可以直接计算【分钟负数正好减去多出的小时转的分支】
	printf("%d %d",e / 60,e % 60);
	return 0;
}

P1421 小玉买文具

题目描述
班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 11 元 99 角,而班主任给小玉的钱是 a 元 b 角,小玉想知道,她最多能买多少只签字笔呢。

输入格式
输入只有一行两个整数,分别表示 a 和 b。

输出格式
输出一行一个整数,表示小玉最多能买多少只签字笔。

输入输出样例
输入 #1复制
10 3
输出 #1复制
5

对于全部的测试点,保证 0 ≤ a ≤ 1 0 4 , 0 ≤ b ≤ 9 0 \leq a \leq 10^4 ,0 \leq b \leq 9 0a1040b9

全部转换为角计算 19一支

#include<bits/stdc++.h>

using namespace std;
    
int main()
{
    
    
    int a, b;
    scanf("%d%d", &a, &b);
    
    int money = a * 10 + b;
    int num = money / 19;
    
    printf("%d\n", num);
        
    return 0;
}

P3954 [NOIP2017 普及组] 成绩

题目描述
牛牛最近学习了 C++ 入门课程,这门课程的总成绩计算方法是:

总成绩=作业成绩\times 20%+×20%+小测成绩×30%+×30%+期末考试成绩\times 50%×50%

牛牛想知道,这门课程自己最终能得到多少分。

输入格式
三个非负整数 A,B,CA,B,C,分别表示牛牛的作业成绩、小测成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是 100100 分。

输出格式
一个整数,即牛牛这门课程的总成绩,满分也是 100100 分。

输入输出样例
输入 #1复制
100 100 80
输出 #1复制
90
输入 #2复制
60 90 80
输出 #2复制
79
对于 30 % 30\% 30% 的数据, A = B = 0 A=B=0 A=B=0

对于另外 30 % 30\% 30% 的数据, A = B = 100 A=B=100 A=B=100

对于 100 % 100\% 100% 的数据, 0 ≤ A , B , C ≤ 1000 0≤A,B,C≤1000 0A,B,C1000 A , B , C A,B,C A,B,C都是 10 10 10 的整数倍。

加权平均成绩

#include<bits/stdc++.h>

using namespace std;
    
int main()
{
    
    
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);

    int score = (a * 2 + b * 3 + c * 5) / 10;
    
    printf("%d\n", score);
        
    return 0;
}

【入门2】分支结构

P2433 【深基1-2】小学数学 N 合一

基础+基础+基础

P5709 【深基2.习6】Apples Prologue / 苹果和虫子

题目描述
八尾勇喜欢吃苹果。她现在有 mm(1 \le m \le 1001≤m≤100)个苹果,吃完一个苹果需要花费 tt(0 \le t \le 1000≤t≤100)分钟,吃完一个后立刻开始吃下一个。现在时间过去了 ss(1 \le s \le 100001≤s≤10000)分钟,请问她还有几个完整的苹果?

输入格式
输入三个非负整数表示 m, t, sm,t,s。

输出格式
输出一个整数表示答案。

输入输出样例
输入 #1复制
50 10 200
输出 #1复制
30

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int m, t, s;
    scanf("%d%d%d",&m, &t, &s);
    
    if(t == 0 || s / t >= m) //全部吃完 
    {
    
    
        puts("0");
    }
    else  if(s % t) //非整数
    {
    
    
        printf("%d", m - s / t - 1); //一个正在吃的苹果
    }
    else printf("%d", m - s / t);
      
    return 0;
}

*P5710 【深基3.例2】数的性质

题目描述
一些整数可能拥有以下的性质:

性质 1:是偶数;
性质 2:大于 4 4 4 且不大于 12 12 12
小 A 喜欢这两个性质同时成立的整数;Uim 喜欢这至少符合其中一种性质的整数;八尾勇喜欢刚好有符合其中一个性质的整数;正妹喜欢不符合这两个性质的整数。现在给出一个整数 x,请问他们是否喜欢这个整数?

输入格式
输入一个整数 x ( 0 ≤ x ≤ 1000 ) x(0\le x \le 1000) x(0x1000)

输出格式
输出这 4 个人是否喜欢这个数字,如果喜欢则输出 1,否则输出 0,用空格分隔。输出顺序为:小 A、Uim、八尾勇、正妹。

输入输出样例
输入 #1复制
12
输出 #1复制
1 1 0 0

#include<bits/stdc++.h>

using namespace std;


int main()
{
    
    
    int x;
    scanf("%d", &x);
    bool f1 = !(x & 1), f2 = (x > 4 && x <= 12); //条件表达式的返回值
    
    printf("%d %d %d %d",  f1 && f2, f1 | f2, f1 ^ f2, !f1 && !f2);   //f1 ^ f2其中有一个成立
   
    return 0;
}

P5711 【深基3.例3】闰年判断

题目描述
输入一个年份,判断这一年是否是闰年,如果是输出 11,否则输出 00。

输入格式
输入一个正整数 nn,表示年份。

输出格式
输出一行。如果输入的年份是闰年则输出 11,否则输出 00。

输入输出样例
输入 #1复制
1926
输出 #1复制
0
输入 #2复制
1900
输出 #2复制
0

#include<bits/stdc++.h>

using namespace std;

bool check(int y)
{
    
    
    if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
        return true;
    return false;
}

int main()
{
    
    
    int year;
    scanf("%d", &year);
    
    if(check(year)) puts("1");
    else puts("0");
    
    return 0;
}

P5712 【深基3.例4】Apples

题目描述
八尾勇喜欢吃苹果。她今天吃掉了 xx 个苹果。英语课上学到了 apple 这个词语,想用它来造句。如果她吃了 1 个苹果,就输出 Today, I ate 1 apple.;如果她没有吃,那么就把 1 换成 0;如果她吃了不止一个苹果,别忘了 apple 这个单词后面要加上代表复数的 s。你能帮她完成这个句子吗?

输入格式
输入一行一个自然数 xx,表示吃掉的苹果数。

输出格式
根据题目要求输出。

输入输出样例
输入 #1复制
1
输出 #1复制
Today, I ate 1 apple.
输入 #2复制
3
输出 #2复制
Today, I ate 3 apples.

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int x;
    scanf("%d", &x);
    if(x == 0) puts("Today, I ate 0 apple.");
    else if(x == 1) puts("Today, I ate 1 apple.");
    else printf("Today, I ate %d apples.", x);
    
    return 0;
}

P5713 【深基3.例5】洛谷团队系统

题目描述
在洛谷上使用团队系统非常方便的添加自己的题目。如果在自己的电脑上配置题目和测试数据,每题需要花费时间 55 分钟;而在洛谷团队中上传私有题目,每题只需要花费 33 分钟,但是上传题目之前还需要一次性花费 11 分钟创建与配置团队。现在要配置 nn 道题目,如果本地配置花费的总时间短,请输出 Local,否则输出 Luogu。

输入格式
输入一个正整数 nn,表示需要配置的题目量。

输出格式
输出一行,一个字符串。如果本地配置花费的总时间短,请输出 Local,否则输出 Luogu。

输入输出样例
输入 #1复制
2
输出 #1复制
Local
输入 #2复制
50
输出 #2复制
Luogu

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int x;
    scanf("%d", &x);
    int Local =  5 * x, Luogu = 11 + 3 * x;
    if(Local < Luogu) puts("Local");
    else puts("Luogu");
    
    return 0;
}

*P5714 【深基3.例7】肥胖问题 [保留六位有效数字%g]

题目描述
BMI 指数是国际上常用的衡量人体胖瘦程度的一个标准,其算法是 m h 2 \dfrac{m}{h^2} h2m

,其中 m 是指体重(千克),h 是指身高(米)。不同体型范围与判定结果如下:

小于 18.5:体重过轻,输出 Underweight;
大于等于 18.5 且小于 24:正常体重,输出 Normal;
大于等于 24:肥胖,不仅要输出 BMI 值(使用 cout 的默认精度),然后换行,还要输出 Overweight;
现在给出体重和身高数据,需要根据 BMI 指数判断体型状态并输出对应的判断。

对于非 C++ 语言,在输出时,请四舍五入保留六位有效数字输出,如果小数部分存在后缀 0,不要输出后缀 0。

请注意,保留六位有效数字不是保留六位小数。例如 114.5149应该输出为 114.515,9198.10 应该输出为 9198.1。

输入格式
共一行。

第一行,共 2 个浮点数,m,n,分别表示体重(单位为 kgkg),身高(单位为 m)。

输出格式
输出一行一个字符串,表示根据 BMI 的对应判断。特别地,对于 Overweight 情况的特别处理请参照题目所述。

输入输出样例
输入 #1复制
70 1.72
输出 #1复制
Normal
说明/提示
对于所有数据, 40 ≤ m ≤ 120 , 1.4 ≤ h ≤ 2.0 40\le m \le 120, 1.4 \le h \le 2.0 40m120,1.4h2.0
m 和 h 的小数点后不超过三位。

#include<bits/stdc++.h>

using namespace std;


int main()
{
    
    
    double m, h;
    scanf("%lf%lf,", &m, &h);
    double t = m / h / h;
    if(t < 18.5) puts("Underweight");
    else if(t >= 18.5 && t < 24) puts("Normal");
    else
    {
    
    
        cout<< t << endl;
        puts("Overweight");
    } 
    //使用 cout 的默认精度 : 6位有效数字 != 小数点后6位
    
    
    return 0;
}
#include<bits/stdc++.h>

using namespace std;


int main()
{
    
    
    double m, h;
    scanf("%lf%lf,", &m, &h);
    double t = m / h / h;
    if(t < 18.5) puts("Underweight");
    else if(t >= 18.5 && t < 24) puts("Normal");
    else
    {
    
    
        // cout<< t << endl;
        printf("%.6g\nOverweight", t);
    } 
    //使用 cout 的默认精度 : 6位有效数字 != 小数点后6位
    
    
    return 0;
}

P5715 【深基3.例8】三位数排序

题目描述
给出三个整数 a,b,c(0\le a,b,c \le 100)a,b,c(0≤a,b,c≤100),要求把这三位整数从小到大排序。

输入格式
输入三个整数 a,b,ca,b,c,以空格隔开。

输出格式
输出一行,三个整数,表示从小到大排序后的结果。

输入输出样例
输入 #1复制
1 14 5
输出 #1复制
1 5 14
输入 #2复制
2 2 2
输出 #2复制
2 2 2

#include<bits/stdc++.h>

using namespace std;

int a[3];

int main()
{
    
    
    for(int i = 0; i < 3; i++) scanf("%d", &a[i]);
    sort(a, a + 3);
    for(int i = 0; i < 3; i++) printf("%d ", a[i]);
    
    return 0;
}

P5716 【深基3.例9】月份天数

题目描述
输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。

输入格式
输入两个正整数,分别表示年份 yy 和月数 mm,以空格隔开。

输出格式
输出一行一个正整数,表示这个月有多少天。

输入输出样例
输入 #1复制
1926 8
输出 #1复制
31
输入 #2复制
2000 2
输出 #2复制
29

#include<bits/stdc++.h>

using namespace std;

int mm[13] = {
    
    0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check(int y)
{
    
    
    if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
        return true;
    return false;
}

int main()
{
    
    
    int y, m;
    scanf("%d%d", &y, &m);
    
    if(m == 2)
    {
    
    
        int ans = mm[m] + check(y);
        printf("%d", ans);
    }
    else printf("%d", mm[m]);
    
    return 0;
}

P1085 [NOIP2004 普及组] 不高兴的津津

题目描述
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入格式
输入包括 77 行数据,分别表示周一到周日的日程安排。每行包括两个小于 1010 的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出格式
一个数字。如果不会不高兴则输出 00,如果会则输出最不高兴的是周几(用 1, 2, 3, 4, 5, 6, 71,2,3,4,5,6,7 分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

输入输出样例
输入 #1复制
5 3
6 2
7 2
5 3
5 4
0 4
0 6
输出 #1复制
3

#include<bits/stdc++.h>

using namespace std;

int q[7];

int main()
{
    
    
    int a, b, maxv = -1, idx = 0;
    for(int i = 0; i < 7; i++)
    {
    
    
        scanf("%d%d", &a, &b);
        q[i] = a + b;
        if(maxv < q[i] && q[i] > 8)
        {
    
    
            maxv = q[i];
            idx = i + 1;
        }
    }
    
    printf("%d", idx);
    
    return 0;
}

P1909 [NOIP2016 普及组] 买铅笔

题目背景
NOIP2016 普及组 T1

题目描述
P 老师需要去商店买 nn 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 33 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P 老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 nn 支铅笔才够给小朋友们发礼物。

现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 nn 支铅笔最少需要花费多少钱。

输入格式
第一行包含一个正整数 nn,表示需要的铅笔数量。

接下来三行,每行用 22 个正整数描述一种包装的铅笔:其中第 11 个整数表示这种包装内铅笔的数量,第 22 个整数表示这种包装的价格。

保证所有的 77 个数都是不超过 1000010000 的正整数。

输出格式
11 个整数,表示 P 老师最少需要花费的钱。

输入输出样例
输入 #1复制
57
2 2
50 30
30 27
输出 #1复制
54
输入 #2复制
9998
128 233
128 2333
128 666
输出 #2复制
18407
输入 #3复制
9999
101 1111
1 9999
1111 9999
输出 #3复制
89991
说明/提示
铅笔的三种包装分别是:

2 支装,价格为 2;
50 支装,价格为 30;
30 支装,价格为 27。
P老师需要购买至少 57 支铅笔。

如果她选择购买第一种包装,那么她需要购买 2929 份,共计 2 \times 29 = 582×29=58 支,需要花费的钱为 2 \times 29 = 582×29=58。

实际上,P 老师会选择购买第三种包装,这样需要买 22 份。虽然最后买到的铅笔数量更多了,为 30 \times 2 = 6030×2=60 支,但花费却减少为 27 \times 2 = 5427×2=54,比第一种少。

对于第二种包装,虽然每支铅笔的价格是最低的,但要够发必须买 22 份,实际的花费达到了 30 \times 2 = 6030×2=60,因此 P 老师也不会选择。

所以最后输出的答案是 5454。

【数据范围】

保证所有的 77 个数都是不超过 1000010000 的正整数。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int s, a, b, minv = 0x3f3f3f3f;
    scanf("%d", &s);
    for(int i = 0; i < 3; i++)
    {
    
    
        scanf("%d%d", &a, &b);
        int t = ((s / a) + (bool)(s % a)) * b;//数量 * 单价 = money
        if(minv > t) 
            minv = t;
    }
    
    printf("%d", minv);
    
    return 0;
}

P5717 【深基3.习8】三角形分类

P1422 小玉家的电费

P1424 小鱼的航程(改进版)

题目背景
题目描述
有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x 开始算起,过了 n 天以后,小鱼一共累计游泳了多少公里呢?

输入格式
输入两个正整数 x,n,表示从周 x 算起,经过 n 天。

输出格式
输出一个整数,表示小鱼累计游泳了多少公里。

输入输出样例
输入 #1复制
3 10
输出 #1复制
2000
说明/提示
数据保证, 1 ≤ x ≤ 7 , 1 ≤ n ≤ 1 0 6 1\le x \le 7,1≤n≤10 ^6 1x71n106

//利用 for 循环,让 sum 累加 250,同时x ++
//当x == 7的时候,将 x 置为 0,接着 x ++

#include<cstdio>
using namespace std;

int main()
{
    
    
	int x, n,sum,i;
	sum = 0;
	scanf("%d%d",&x,&n);
	for(i = 0;i < n;i++)
	{
    
    
		if(x != 6 && x != 7)
			sum += 250;
		
// 		if(x == 7)
// 			x = 0;
		x %= 7; //x = 7时置0
		x ++;
	}
	printf("%d",sum);
	return 0;		
} 

P1888 三角函数

题目描述
输入一组勾股数 a , b , c ( a ≠ b ≠ c ) a,b,c(a\neq b\neq c) a,b,ca=b=c
用分数格式输出其较小锐角的正弦值。(要求约分。)

输入格式
一行,包含三个正整数,即勾股数 a,b,ca,b,c(无大小顺序)。

输出格式
一行,包含一个分数,即较小锐角的正弦值

输入输出样例
输入 #1复制
3 5 4
输出 #1复制
3/5
说明/提示
数据保证:a,b,ca,b,c 为正整数且 ∈ [ 1 , 1 0 9 ] \in [1,10^9] [1,109]

#include<bits/stdc++.h>

using namespace std;

int q[3];

int main()
{
    
    
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    q[0] = a, q[1] = b, q[2] = c;    
    sort(q, q + 3);
    int t = __gcd(__gcd(a, b), __gcd(a, c));
    // int t = min(min(__gcd(a, b), __gcd(b, c)), __gcd(a, c));
    
    for(int i = 0; i < 3; i++) q[i] /= t; //全部约分
    
    printf("%d/%d", q[0], q[2]);
        
    return 0;
    
}

P1046 [NOIP2005 普及组] 陶陶摘苹果

题目描述
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 1010 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 3030 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知 1010 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

输入格式
输入包括两行数据。第一行包含 1010 个 100100 到 200200 之间(包括 100100 和 200200 )的整数(以厘米为单位)分别表示 1010 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100100 到 120120 之间(包含 100100 和 120120 )的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

输出格式
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

输入输出样例
输入 #1复制
100 200 150 140 129 134 167 198 200 111
110
输出 #1复制
5

#include<bits/stdc++.h>

using namespace std;

int q[10];

int main()
{
    
    
    for(int i = 0; i < 10; i++) scanf("%d", &q[i]);

    int h, res = 0;
    scanf("%d", &h);
    for(auto i: q) //只开了十个位置, 没有多余的位置哦
        if(h + 30 >= i)
            res ++;
    
    printf("%d", res);  
        
    return 0;
    
}

P4414 [COCI2006-2007#2] ABC

题目描述
You will be given three integers A, B and C. The numbers will not be given in that exact order, but we do know that A is less than B and B less than C. In order to make for a more pleasant viewing, we want to rearrange them in the given order.

输入格式
The first line contains three positive integers A, B and C, not necessarily in that order. All three numbers will be less than or equal to 100. The second line contains three uppercase letters ‘A’, ‘B’ and ‘C’ (with no spaces between them) representing the desired order.

输出格式
Output the A, B and C in the desired order on a single line, separated by single spaces.

题意翻译
【题目描述】

三个整数分别为 A,B,CA,B,C。这三个数字不会按照这样的顺序给你,但它们始终满足条件:A < B < CA<B<C。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。

【输入格式】

第一行包含三个正整数 A,B,CA,B,C,不一定是按这个顺序。这三个数字都小于或等于 100100。第二行包含三个大写字母 AA、BB 和 CC(它们之间没有空格)表示所需的顺序。

【输出格式】

在一行中输出 AA,BB 和 CC,用一个 (空格)隔开。

感谢 @smartzzh 提供的翻译

输入输出样例
输入 #1复制
1 5 3
ABC
输出 #1复制
1 3 5
输入 #2复制
6 4 2
CAB
输出 #2复制
6 2 4

#include<bits/stdc++.h>
#define x first
#define y second

using namespace std;

typedef pair<int, string> PIS;

PIS q[3];

int main()
{
    
    
    for(int i = 0; i < 3; i++) scanf("%d", &q[i].x);
    sort(q, q + 3);
    for(int i = 0; i < 3; i++) q[i].y = 'A' + i;
    
    string s;
    cin >> s; 
    do
    {
    
    
        string res;
        for(int i = 0; i < 3; i++) res += q[i].y;
        if(s == res) 
            for(int i = 0; i < 3; i++) printf("%d ",q[i].x);
    }
    while(next_permutation(q, q + 3)); //全排列 - 找到目标序列
    
    
    return 0;
}
//pair string不好取sting[0] = char 
    // for(int i = 0; i < 3; i++)
    //     for(int j = 0; j < 3; j++)
    //     {
    
    
    //         string t = q[j].y;
    //         if(!strcmp(s[i], t[0])) 
    //             printf("%d ",q[i].x);
    //     }    

P1055 [NOIP2008 普及组] ISBN 号码

【入门3】循环结构

P5718 【深基4.例2】找最小值

题目描述
给出 n 和 n 个整数 a i a_i ai

,求这 n 个整数中最小值是什么。

输入格式
第一行输入一个正整数 n,表示数字个数。

第二行输入 n 个非负整数,表示 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2an
​ ,以空格隔开。

输出格式
输出一个非负整数,表示这 nn 个非负整数中的最小值。

输入输出样例
输入 #1复制
8
1 9 2 6 0 8 1 7
输出 #1复制
0
说明/提示
数据保证, n ≤ 100 且 0 ≤ a i ≤ 10000 n\le100 且 0\le a_i \le 10000 n1000ai10000

#include<bits/stdc++.h>

using namespace std;

const int N = 110;
int q[N];

int main()
{
    
    
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    int minv = 0x3f3f3f3f;
    for(int i = 0; i < n; i++) 
    {
    
    
        if(minv > q[i])
            minv = q[i];
    }
    
    printf("%d\n", minv);
        
    return 0;
}

P5719 【深基4.例3】分类平均

题目描述
给定 n和 k,将从 1 到 nx 之间的所有正整数可以分为两类:A 类数可以被 k 整除(也就是说是 k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 位,用空格隔开。

数据保证两类数的个数都不会是 0。

输入格式
输入两个正整数 n 与 k。

输出格式
输出一行,两个实数,分别表示 A 类数与 B 类数的平均数。精确到小数点后一位。

输入输出样例
输入 #1复制
100 16
输出 #1复制
56.0 50.1
说明/提示
数据保证, 1 ≤ n ≤ 10000 1 \leq n\leq 10000 1n10000 1 ≤ k ≤ 100 1 \leq k \leq 100 1k100

直接模拟

#include<bits/stdc++.h>

using namespace std;

const int N = 1010;

int q[N];
    
int main()
{
    
    
    int n, k;
    scanf("%d%d", &n, &k);
    
    double s1 = 0, s2 = 0;
    int cnt1 = 0, cnt2 = 0;
    for(int i = 1; i <= n; i++)
    {
    
    
        if(i % k == 0 ) s1 += i, cnt1++;
        else s2 += i, cnt2 ++;
    }
    
    printf("%.1lf %.1lf\n",s1 / cnt1, s2 / cnt2);
        
    return 0;
}

优化

# include <iostream>
# include <stdio.h>

using namespace std;

int n, k, sum;

int main () {
    
    
	scanf ("%d%d", &n, &k);
	for (int i = k; i <= n; i += k)
		sum += i;
	printf ("%.1f ", double (sum) / (n / k)); 
	sum = (1 + n) * n / 2 - sum;
	printf ("%.1f\n", double (sum) / (n - n / k));
	return 0;
}

P5720 【深基4.例4】一尺之棰

P5721 【深基4.例6】数字直角三角形

P1009 [NOIP1998 普及组] 阶乘之和

P1980 [NOIP2013 普及组] 计数问题

佬的暴力STL解法

看到一些题解都用上sprintf和stringstream了,怎么不干脆再暴力一点呢

c++里这么多string库函数,还有各种算法支持,很多时候用字符串常常能带来意想不到的效果。例如本题,就可以使用字符串的方法。

我的思路是把数值都转为字符串,存到一个字符串里,然后就可以进行各种花式操作

在这里先给大家介绍数值与字符串相互转换的几种方法

先从简单的开始

string to_string (int val);

string to_string (double val);

这是C++11新增的库函数,已重载各种标准类型,用法很简单,例如 string s = to_string(123);

但是对于大量数据只能一个数一个数转换,颇为繁琐

还有一种方法就是 stringstream (使用stringstream 需包含头文件 )

int a = 123, b = 456, c = 789;

stringstream ss;

ss << a << b << c;

以上几行把a b c三个变量读入字符串流中,这样就可以把a b c三个变量无缝衔接起来,但是需要注意的是,stringstream型不能直接输出,也不支持迭代器,需要利用stringstream类的成员函数str()才能把它当成普通字符串来用,例如

string s = ss.str();

而把字符串转为数值的话也是用stringstream,例如上面的ss就可以转换为一个int型

int i;

ss >> i;

以上都是C++的方法,c语言有sprintf和sscanf,对应stringstream字符串流的读和写,<stdlib.h>中还有数值与字符串相互转换的iota和atoi函数,感兴趣的可以自己去了解。用c语言的sprintf比C++的字符串流效率高,但是我还是想用C++的字符串,为啥?因为C++字符串的可拓展性和灵活性比较高嘛hhhh

嗯姆,接下来再讲一个算法库的函数,位于 头文件中

count(ivec.begin() , ivec.end() , searchValue)

这个函数作用是统计在一定范围内某一值出现的次数

前两个参数为起始位置和结束位置,都是迭代器,第三个参数为需要统计的值

还有一个count_if函数更加强大,感兴趣的可以自己去了解

接下来放上本题我的AC代码,带大家见识一下stringstream和algorithm能擦出怎样的火花!

#include <bits/stdc++.h>
using namespace std;
  
int main() {
    
    
   int n, x;
   cin >> n >> x;
   stringstream ss;
   for (n++; --n; ss << n);     //把1-n的值都存放到字符串流中
   string s = ss.str();
   cout << count(s.begin(), s.end(), x + '0') << endl;    //运用count函数直接出结果,简简单单
   return 0;
}

P1035 [NOIP2002 普及组] 级数求和

P2669 [NOIP2015 普及组] 金币

题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 nn 天每天收到 nn 枚金币后,骑士会在之后的连续 n+1 天里,每天收到 n+1枚金币。

请计算在前 k 天里,骑士一共获得了多少金币。

输入格式
一个正整数 k ,表示发放金币的天数。

输出格式
一个正整数,即骑士收到的金币数。

输入输出样例
输入 #1复制
6
输出 #1复制
14
输入 #2复制
1000
输出 #2复制
29820
说明/提示
【样例 1 说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1 + 2 + 2 + 3 + 3 + 3 = 14 1+2+2+3+3+3=14 1+2+2+3+3+3=14 枚金币。

对于 100 % 的数据, 1 ≤ k ≤ 1 0 4 100\% 的数据,1\le k\le 10^4 100%的数据,1k104
4

(级数求和 > k 的项数)

找到答案return版

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int day, cnt = 0, s = 0;
    scanf("%d", &day);
    
    for(int i = 1; ; i++)
    {
    
    
        for(int j = i; j > 0; j--)
        {
    
    
            s += i;
            
            cnt ++;
            // cout << i << " " << cnt << endl;
            if(cnt == day) 
            {
    
    
                printf("%d" , s);
                return 0;
            }
        }
    }
    return 0;
}

用两次break退出两层循环

#include<bits/stdc++.h>

using namespace std;

int main()
{
    
    
    int day, cnt = 0, s = 0;
    scanf("%d", &day);
    
    for(int i = 1; ; i++)
    {
    
    
        for(int j = i; j > 0; j--)
        {
    
    
            s += i;
            
            cnt ++;
            // cout << i << " " << cnt << endl;
            if(cnt == day) break; 
        }
        if(cnt == day) break; //【break只能结束一层循环 - 需二次】
    }
    
    printf("%d" , s);
    return 0;
}

P5722 【深基4.例11】数列求和

P5723 【深基4.例13】质数口袋

P1217 [USACO1.5]回文质数 Prime Palindromes

P1423 小玉在游泳

题目描述
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 2 2 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98 % 98\% 98%。现在小玉想知道,如果要游到距离 x x x 米的地方,她需要游多少步呢。请你编程解决这个问题。

输入格式
输入一个实数 ss(单位:米),表示要游的目标距离。

输出格式
输出一个整数,表示小玉一共需要游多少步。

输入输出样例
输入 #1复制
4.3
输出 #1复制
3
说明/提示
数据保证, 0 ≤ s ≤ 100 0 \leq s \leq 100 0s100,且 s 小数点后最多只有一位。

#include<bits/stdc++.h>

using namespace std;
    
int main()
{
    
    
    double target;
    scanf("%lf", &target);
    double cnt = 0,s = 2, p = 0.98;
    
    int step = 0;
    while(true)
    {
    
    
        cnt += s, step ++;
        s *= p;
        if(cnt >= target) break;
    }
    printf("%d\n", step);
        
    return 0;
}
#include<bits/stdc++.h>

using namespace std;
    
int main()
{
    
    
    double target;
    scanf("%lf", &target);
    double cnt = 0,s = 2, p = 0.98;
    
    for(int i = 1; ; i++)
    {
    
    
        cnt += s;
        s *= p;
        if(cnt >= target)
        {
    
    
            printf("%d\n", i);
            break;
        }
    }
        
    return 0;
}

*P1307 [NOIP2011 普及组] 数字反转

[-1e9,1e9] :int范围内
经典翻转 - 类似秦九韶【等效翻转-个位变成最高位】

#include<bits/stdc++.h>

using namespace std;

int n, res;
int main()//以上应该都懂,不解释
{
    
    
    scanf("%d", &n);
    while(n)
    {
    
    
        res = res * 10 + n % 10; //类似秦九韶【等效翻转-个位变成最高位】
        n /= 10;        
    }
        
    printf("%d", res);
    
    return 0;
}

不知道string哪里错了, orz

#include<bits/stdc++.h>

using namespace std;
    
int main()
{
    
    
    string str;
    cin >> str;
    if(str == "0")
    {
    
    
        cout << str << endl;
        return 0;
    }
    
    while(str.back() == '0') str.pop_back();
    reverse(str.begin(), str.end());
    if(str.back() == '-' ) str.pop_back();
    
    cout << str << endl;
        
    return 0;
}

P1720 月落乌啼算钱(斐波那契数列)

题目描述
算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 n 样菜价格多少?”月落乌啼写出了:

F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n}{\sqrt{5}} Fn=5 (21+5 )n(215 )n

由于爱与愁大神学过编程,于是就用 11 分钟的时间求出了 F n F_n Fn的结果。

月落乌啼为此大吃一惊。你能学学爱与愁大神求出 F n F_n Fn 的值吗?

输入格式
一行一个自然数 n n n

输出格式
只有 11 行一个实数 F n F_n Fn ,保留两位小数。

输入输出样例
输入 #1复制
6
输出 #1复制
8.00
说明/提示
对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0n48

函数版

#include<bits/stdc++.h>

using namespace std;

int main() 
{
    
     
    int n;
    scanf("%d",&n);
    double ans = (pow(((1+sqrt(5))/2),n)-pow(((1-sqrt(5))/2),n))/sqrt(5);
    printf("%.2f", ans); 
    return 0;
}

可以计算发现规律:斐波那契数列递推版】 递归会超时

#include<bits/stdc++.h>

using namespace std;

double fib(int n)
{
    
    
    if(n == 0) return 0;
    if(n == 1 || n == 2) return 1;
    double a = 1, b = 1, c = 0;
    for(int i = 1; i < n; i++)
    {
    
    
        c = a + b;
        a = b, b = c;
    }
    return a;
}

int main() 
{
    
     
    int n;
    scanf("%d",&n);
    printf("%.2f", fib(n)); 
    return 0;
}

P5724 【深基4.习5】求极差 / 最大跨度值

题目描述
给出 n n n n n n 个整数 a i a_i ai

,求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

输入格式
第一行输入一个正整数 n n n,表示整数个数。

第二行输入 nn 个整数 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2an

,以空格隔开。

输出格式
输出一个整数,表示这 nn 个整数的极差。

输入输出样例
输入 #1复制
6
1 1 4 5 1 4
输出 #1复制
4

#include<bits/stdc++.h>

using namespace std;

const int N = 110;

int q[N];
    
int main()
{
    
    
    int n;
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    int maxv = 0, minv = 0x3f3f3f3f;
    for(int i = 0; i < n; i++)
    {
    
    
        if(minv > q[i]) minv = q[i];
        if(maxv < q[i]) maxv = q[i];
    }
        
    int ans = maxv - minv;
    
    printf("%d", ans);
        
    return 0;
}

sort

#include<bits/stdc++.h>

using namespace std;

const int N = 1010;

int q[N];
    
int main()
{
    
    
    int n;
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    sort(q, q + n);
    printf("%d", q[n - 1] - q[0]); //max - min
  
    return 0;
}

P1420 最长连号

P1075 [NOIP2012 普及组] 质因数分解

题目描述
已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入格式
输入一个正整数 n。

输出格式
输出一个正整数 p,即较大的那个质数。

输入输出样例
输入 #1复制
21
输出 #1复制
7
说明/提示
1 ≤ n ≤ 2 × 1 0 9 1 \le n\le 2\times 10^9 1n2×109

n % 第一个较小质因数 == 0 , 较大的质因数 == n / 较小质因数


#include<bits/stdc++.h>

using namespace std;

int q[15];
    
int main()
{
    
    
    int n;
    scanf("%d", &n);
    
    for(int i = 2; i <= n / i; i++)
    {
    
    
        if(n % i == 0)
        {
    
    
            printf("%d", n / i);
            break;
        }
    }
    
    return 0;
}

逆序直接找较大的质因数

#include <bits/stdc++.h>
using namespace std;
int main() {
    
    
    int n;
    cin >> n;
    for (int i = n - 1; i >= n / i; i--) if (n % i == 0) {
    
     
        cout << i;
        break;
    }
    return 0;
}

P5725 【深基4.习8】求三角形

P5726 【深基4.习9】打分

题目描述
现在有 n ( n ≤ 1000 ) n(n \le 1000) n(n1000) 位评委给选手打分,分值从 0 0 0 10 10 10。需要去掉一个最高分,去掉一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分。现在输入评委人数和他们的打分,请输出选手的最后得分,精确到 2 2 2 位小数。

输入格式
第一行输入一个正整数 n n n,表示有 n n n 个评委。

第二行输入 n n n 个正整数,第 i i i 个正整数表示第 i i i 个评委打出的分值。

输出格式
输出一行一个两位小数,表示选手的最后得分。

输入输出样例
输入 #1复制
5
9 5 6 8 9
输出 #1复制
7.67
说明/提示
数据保证, 3 ≤ n ≤ 1000 3 \leq n \leq 1000 3n1000,每个评委打出的分值为为 0 0 0 10 10 10(含 0 0 0 10 10 10)之间的整数。

double(sum - 最大值 - 最小值) / (n - 2.0)

#include<bits/stdc++.h>

using namespace std;

const int N = 1010;

int q[N];
    
int main()
{
    
    
    int n;
    scanf("%d", &n);
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    int maxv = 0, minv = 0x3f3f3f3f, sum = 0;
    for(int i = 0; i < n; i++)
    {
    
    
        sum += q[i];
        if(minv > q[i]) minv = q[i];
        if(maxv < q[i]) maxv = q[i];
    }
    
        
    double ans = (sum - maxv - minv) / (n - 2.0);
    
    printf("%.2lf", ans);
        
    return 0;
}

P4956 [COCI2017-2018#6] Davor

P1089 [NOIP2004 提高组] 津津的储蓄计划

【入门4】数组

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

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

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

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

输入格式
第一行有两个用空格隔开的整数,分别代表 n n n m m m

2 2 2 到第 ( n + 1 ) (n + 1) (n+1) 行,每行一个整数,第 ( i + 1 ) (i + 1) (i+1) 行的整数 a i a_i ai

代表第 i 件事的刺痛值 a i a_i ai

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

输入输出样例
输入 #1复制
8 3
1
4
7
3
1
2
4
3
输出 #1复制
6
说明/提示
数据规模与约定
对于 30 % 30\% 30% 的数据,保证 n ≤ 20 n \leq 20 n20
对于 60 % 60\% 60% 的数据,保证 n ≤ 100 n \leq 100 n100
对于 90 % 90\% 90% 的数据,保证 n ≤ 1 0 3 n \leq 10^3 n103
对于 100 % 100\% 100%的数据,保证 0 ≤ m ≤ n ≤ 3 × 1 0 3 , 1 ≤ a i ≤ 100 0 \leq m \leq n \leq 3 \times 10^3 ,1 \leq a_i \leq 100 0mn3×1031ai100

90% - orz

#include<bits/stdc++.h>

using namespace std;

const int N = 3e3 + 10;
int q[N];

int main()
{
    
    
    int n, m;
    scanf("%d%d", &n, &m); //连续m个数最小值
    
    if(n == 0 || m == 0)
    {
    
    
        puts("0");
        return 0;
    }
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    int minv = 0x3f3f3f3f;
    for(int i = 0; i < n - m; i++)
    {
    
    
        int sum = 0;
        for(int j = 0; j < m; j++)
        {
    
    
            sum += q[i + j];
        }
        if(minv > sum) 
            minv = sum;
    }
    printf("%d\n", minv);
        
	return 0;
} 

80% - orz


#include <bits/stdc++.h>

using namespace std;

const int N = 3010;

int q[N];


int main()
{
    
    
    int n, m;
    scanf("%d%d", &n, &m);
    
    if(n == 0 || m == 0)
    {
    
    
        puts("0");
        return 0;
    }
    
    int minv = 0x3f3f3f3f, sum = 0;
    for(int i = 1; i <= n; i++) //类似滑动窗口:窗口大小为m 
    {
    
    
        scanf("%d", &q[i]);
        if(i <= m) sum += q[i];
        else minv = min(minv, sum += q[i] - q[i - m]); //一进一出
        // minv = i <= m ? sum += q[i] : min(minv, sum += q[i] - q[i-m]);
    }
        
    printf("%d\n", minv);
    return 0;
}

P1614 爱与愁的心痛

90% - orz
#include<bits/stdc++.h>

using namespace std;

const int N = 3e3 + 10;
int q[N];

int main()
{
    
    
    int n, m;
    scanf("%d%d", &n, &m); //连续m个数最小值
    
    if(n == 0 || m == 0)
    {
    
    
        puts("0");
        return 0;
    }
    
    for(int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    int minv = 0x3f3f3f3f;
    for(int i = 0; i < n - m; i++)
    {
    
    
        int sum = 0;
        for(int j = 0; j < m; j++)
        {
    
    
            sum += q[i + j];
        }
        if(minv > sum) 
            minv = sum;
    }
    printf("%d\n", minv);
        
	return 0;
} 

80% - orz

#include <bits/stdc++.h>

using namespace std;

const int N = 3010;

int q[N];


int main()
{
    
    
    int n, m;
    scanf("%d%d", &n, &m);
    
    if(n == 0 || m == 0)
    {
    
    
        puts("0");
        return 0;
    }
    
    int minv = 0x3f3f3f3f, sum = 0;
    for(int i = 1; i <= n; i++) //类似滑动窗口:窗口大小为m 
    {
    
    
        scanf("%d", &q[i]);
        if(i <= m) sum += q[i];
        else minv = min(minv, sum += q[i] - q[i - m]); //一进一出
        // minv = i <= m ? sum += q[i] : min(minv, sum += q[i] - q[i-m]);
    }
        
    printf("%d\n", minv);
    return 0;
}

【入门5】字符串

【入门6】函数与结构体

猜你喜欢

转载自blog.csdn.net/m0_58466526/article/details/128093181