貌似是O2优化对scanf()输入流的影响

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

Johnaur @ 2025-01-11 13:47:03

代码只能开启O2优化后才能AC

int main(){
    unsigned char apple[11], n = 10;
    scanf(  "%hu%hu%hu%hu%hu%hu%hu%hu%hu%hu%hu",
            apple, apple+1, apple+2, apple+3, apple+4, 
            apple+5, apple+6, apple+7, apple+8, apple+9, 
            apple+10);
    apple[10] = apple[10] + 30;
    if(apple[0] > apple[10]) n = n - 1;
    if(apple[1] > apple[10]) n = n - 1;
    if(apple[2] > apple[10]) n = n - 1;
    if(apple[3] > apple[10]) n = n - 1;
    if(apple[4] > apple[10]) n = n - 1;
    if(apple[5] > apple[10]) n = n - 1;
    if(apple[6] > apple[10]) n = n - 1;
    if(apple[7] > apple[10]) n = n - 1;
    if(apple[8] > apple[10]) n = n - 1;
    if(apple[9] > apple[10]) n = n - 1;
    printf("%hu", n);
    return 0;
}

by chen_z @ 2025-01-11 14:13:47

@Johnaur ?你为啥用 char


by Johnaur @ 2025-01-11 14:30:05

@chen_z为了更小的占用


by Whr___114514 @ 2025-01-11 14:36:18

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,apple[10],l,u;
    for(int i=0;i<10;i++){
        cin>>l;
        apple[i]=l;
    }
    cin>>a;
    for(int i=0;i<10;i++){
        if(a+30>=apple[i]) u++;
    }
    cout<<u;
    return 0;
}

完全可以这样做呀


by Whr___114514 @ 2025-01-11 14:37:01

内存限制
125.00MB


by chen_z @ 2025-01-11 14:45:53

@Johnaur 完全画蛇添足了吧


by Terrible @ 2025-01-11 14:47:59

%hhu 在 C99(洛谷 C 语言是 C99)及以后可以被用于在 scanf 中作为格式符读取 unsigned char%hu 只能用于读取 unsigned short 用于读取 unsigned char 可能属未定义行为。

详见 https://zh.cppreference.com/w/c/io/fscanf


by Johnaur @ 2025-01-11 14:53:02

@Terrible非常感谢


by Terrible @ 2025-01-11 14:55:34

计算机发展到今天,已经没有必要使用短类型整数了(字符串用 char 还是照常用,此处提的是当成整数类型来用)。

卡内存是一件意义不大的事情(125 MB 内存在现在看来根本就太少了),而且根本也没啥必要,去垃圾站随便捞一堆电子垃圾 2GB 内存条。我们都知道值钱的是硬件的设计,不是硬件的生产。

讨论竞赛题的时候尽量不要提题目可能可以在特定的工程上的应用,因为差距其实有点大,知识迁移并不顺畅。把选手思维训练好才是当务之急,不要小家子气。想从事工程相关的工作请移步工程社区。

强调竞赛题中剩下来的那点空间真就意义不大。用,随便用,占用额外内存几乎没有成本,何必斤斤计较呢?


by Johnaur @ 2025-01-11 15:03:49

@Terrible非常感谢解答,我并不是一个竞赛选手,但我希望能通过这样的问题了解更多程序和编译的细节,再次感谢您的解答


by Johnaur @ 2025-01-11 15:23:48

@Johnaur洛谷使用大端存储 即0x1234依次存储为0x12 0x34两个字节


|