1 条题解

  • 0
    @ 2025-5-7 20:17:43

    解题思路

    1. 数据读取与存储
      • 先读取人数 n,接着对每个人,读取其朋友列表并存储,同时记录朋友数量。
      • 再读取垃圾邮件信息,包含发起者、两个阈值和三个属性,进行存储。
      • 最后读取每个人的名字。
    2. 垃圾邮件传播模拟
      • 针对每封垃圾邮件,运用广度优先搜索(BFS)模拟传播过程。从发起者开始,将其朋友依次加入队列。
      • 依据每个人转发的邮件数量(即朋友数量)和垃圾邮件的阈值,确定其获得的属性。
      • 用标记数组记录哪些人已接收并转发过该邮件,未接收的人默认属性为第一个属性。
    3. 结果输出:按输入顺序输出每个人的名字和他们获得的属性。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<queue>
    using namespace std;
    struct node
    {
        char name[2000];//名字
        int peng[1000];//朋友
        char level[1000][200];//level[i][j]:第i个广告为第j种状态
        int num;//朋友的数量
    };
    node p[250];//人
    struct enen
    {
        int s;//广告的第一个发送人
        int xx;
        int dd;
        char level[5][200];
    };
    enen adv[2500];//广告
    int n;
    queue<int> que;
    int main()
    {
        int flag=0,kk;
        while(~scanf("%d",&n))
        {
            if(n==0)flag=1;
            if(flag){scanf("%d",&kk);}
            if(n==0&&kk==0)break;
            int cnt;
            for(int i=1;i<=n;i++)
            {
                cnt=1;
                while(1)
                {
                    int x;
                    scanf("%d",&x);
                    if(x==0)
                        break;
                    p[i].peng[cnt++]=x;
                }
                p[i].num=cnt-1;
            }
            cnt=1;
            while(1)
            {
                int x;
     
                scanf("%d",&x);
                if(x==0)break;
                adv[cnt].s=x;
                scanf("%d%d%s%s%s",&adv[cnt].xx,&adv[cnt].dd,adv[cnt].level[1],adv[cnt].level[2],adv[cnt].level[3]);
                cnt++;
            }
            for(int i=1;i<=n;i++)
                scanf("%s",p[i].name);
            int book[100];
            for(int i=1;i<cnt;i++)//循环每个短信
            {
                memset(book,0,sizeof(book));//标记数组
                que.push(adv[i].s);//将起始人入队
                while(que.size())
                {
                    int q=que.front();
                    if(book[q]==0)//该人没有发过当前短信
                    {
                        for(int j=1;j<=p[q].num;j++)
                            que.push(p[q].peng[j]);//将他的朋友入队
                        if(p[q].num<adv[i].xx)strcpy(p[q].level[i],adv[i].level[1]);
                        else if(p[q].num>=adv[i].xx&&p[q].num<adv[i].dd)strcpy(p[q].level[i],adv[i].level[2]);
                        else strcpy(p[q].level[i],adv[i].level[3]);
                        book[q]=1;//标记
                    }
                    que.pop();
                }
                for(int j=1;j<=n;j++)//如果当前广告有人没接收到过
                    if(book[j]==0)
                        strcpy(p[j].level[i],adv[i].level[1]);
            }
            for(int i=1;i<=n;i++)
            {
                printf("%s:",p[i].name);
                for(int j=1;j<cnt;j++)
                    printf(" %s",p[i].level[j]);
                printf("\n");
            }
        }
        return 0;
    }
    • 1

    信息

    ID
    296
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    1
    上传者