非常短的 fread 读入挂

本文展示了一个使用C++实现的图论算法示例,通过输入节点及其连接关系来计算特定条件下的数值结果。该算法涉及了图的遍历、递归及动态规划等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
#define ll long long
using namespace std; 
const int maxn=100005;
const int BUF=30000000;
char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}//一句话解决
int t,n,m;
int fa[maxn];
bool book[maxn];
int main()
{
    //freopen("in.txt","r",stdin);
    fread(Buf,1,BUF,stdin);//重点
    read(t);
    while(t--)
    {
        read(n); read(m);
        for(int i=2;i<=n;i++)
        {
            int x;
            read(x);
            fa[i]=x;
        }
        memset(book,0,sizeof book);
        int num=0;
        for(int i=n;i;i--)
        {
            if(!book[i])
            book[fa[i]]=1;
            else
            num++;
            if(num*2>=m)break;
        }
        int ans;
        if(m<=num*2)ans=(m+1)/2;
        else
        ans=(m-num*2)+num;
        printf("%d\n",ans );

    }
    return 0;
}

### 使用 `fread` 函数读取二维数组 为了使用 `fread` 函数从文件中读取二维数组,在C语言中有几个关键点需要注意。首先,确保文件是以二进制模式打开的,因为 `fread` 主要用于读取二进制数据[^3]。 下面是一个具体的例子来展示如何利用 `fread` 将文件中的数据加载到二维数组中: 假设有一个简单的文本文件或二进制文件,其中的数据按照特定顺序排列,可以直接映射成一个 m 行 n 列的矩阵形式。这里提供一段示范性的代码片段用来说明这一过程: ```c #include <stdio.h> #include <stdlib.h> #define ROWS 5 /* 定义行数 */ #define COLS 10 /* 定义列数 */ int main() { FILE *file; int matrix[ROWS][COLS]; // 创建一个二维数组 file = fopen("data.bin", "rb"); // 打开二进制文件进行只读操作 if (file == NULL){ perror("Error opening file"); return(-1); } size_t result = fread(matrix, sizeof(int), ROWS*COLS, file); // 一次性读取整个矩阵的内容 if(result != ROWS*COLS) { printf("Reading error\n"); fclose(file); return (-2); } fclose(file); // 输出读取的结果验证是否成功 for (size_t i=0; i<ROWS; ++i){ for(size_t j=0;j<COLS;++j){ printf("%d ",matrix[i][j]); } putchar('\n'); } return(0); } ``` 这段程序先定义了一个固定大小的二维整型数组作为目标容器,接着尝试以二进制读写的方式打开名为 `"data.bin"` 的外部文件,并通过调用 `fread()` 来填充这个预先分配好的空间。最后关闭文件句柄并打印出所得到的数据以便确认一切正常工作。 值得注意的是,当处理像 BMP 这样的图形文件时,由于其特殊的结构(比如每行像素数量需满足 dword 对齐),实际应用中还需要额外考虑去除可能存在的填充字节等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值