注册 登录
编程论坛 C++教室

为什么我的代码可以无限输入TaT

bug芒果核 发布于 2025-09-22 09:00, 840 次点击








#include<stdio.h>
int main(){
    int n,m,min=0,ans=99999;
    scanf("%d%d",&n,&m);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",a[i]);
    }
    for(int i=0;i<n-m;i++){
        int t=i;
        while(m--){
            min+=a[t];
            t++;
        }
        if(min<ans) ans=min;
    }
    printf("%d",ans);
    return 0;
}
题目描述
最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。
输入格式
第一行有两个用空格隔开的整数,分别代表 n 和 m。
第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数ai代表第 i 件事的刺痛值 ai。
输出格式
输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。
输入输出样例
输入
8 3
1
4
7
3
1
2
4
3
输出
6
数据规模与约定
对于 30% 的数据,保证 n≤20。
对于 60% 的数据,保证 n≤100。
对于 90% 的数据,保证 n≤10^3。
对于 100% 的数据,保证 0≤m≤n≤3×10^3,1≤ai≤100。
5 回复
#2
rjsp2025-09-22 10:06
在你的代码上修改
#include<stdio.h>
int main(){
    int n,m,min=0,ans=300000; // 99999; m≤3×10^3,1≤ai≤100 的话,那最大值不是 3×10^3*100 吗?!
    scanf("%d%d",&n,&m);
    int a[100];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]); //
    }
    for(int i=0;i<n-m+1;i++){ //

        int t=i;
        min = 0; //
        for( int j=0; j!=m; ++j ){ // while(m--){ 你的 m 还需要使用呐!
            min += a[t];
            t++;
        }
        if(min<ans) ans=min;
    }
    printf("%d",ans);
    return 0;
}


C语言示例
程序代码:
#include <stdio.h>

int main( void )
{
    size_t n, m;
    scanf( "%zu%zu", &n, &m );

    unsigned char m_ring_buf[3000]; // 题目规定 m≤3×10^3,1≤ai≤100

    unsigned sum = 0;
    for( size_t i=0; i!=m; ++i )
    {
        scanf( "%hhu", &m_ring_buf[i] );
        sum += m_ring_buf[i];
    }

    unsigned min_sum = sum;
    for( size_t i=0; i!=n-m; ++i )
    {
        unsigned char t = m_ring_buf[i%m];
        scanf( "%hhu", &m_ring_buf[i%m] );
        sum += m_ring_buf[i%m] - t;
        if( sum < min_sum )
            min_sum = sum;
    }

    printf( "%u", min_sum );
}


C++语言示例
程序代码:
#include <iostream>
#include <algorithm>
#include <ranges>
#include <vector>
using namespace std;

int main( void )
{
    size_t n, m;
    cin >> n >> m;

    auto rs = views::istream<unsigned>(cin)
        | views::take(n)
        | ranges::to<std::vector>()
        | views::slide(m)
        | views::transform( [](auto rgn){ return ranges::fold_left(rgn,0,std::plus{}); } );

    cout << std::ranges::min(rs);
}
本地执行时,数据输入结束后需要多按一个 CTRL+Z / CTRL+D
#3
yiyanxiyin2025-09-22 10:09
for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }

scanf第二个参数需要传入地址
#4
bug芒果核2025-09-22 13:45
回复 2楼 rjsp
太牛了大佬!!!
只要动动手指就能有大佬手把手教你写题,这样的论坛去哪里找!!!
(但其实大佬给的实例我都看不懂

[此贴子已经被作者于2025-9-22 13:55编辑过]

#5
bug芒果核2025-09-22 13:47
回复 3楼 yiyanxiyin
大佬(原谅我没啥基础
有些时候(比如指针?)就可以不需要‘&’吗
可以讲解一下吗
辛苦大佬!!!
#6
bug芒果核2025-09-24 20:00
回复 5楼 bug芒果核
好吧 我懂了
1