敲7 (队列

有一种酒桌游戏叫做“敲7”,规则是从一个人开始,说出任意数字,其他人会顺序往后报,如果一个数字包含 77,或者是 77 的倍数,那么需要敲打杯子或盘子,不能说出。

现在 nn 个人围坐在一个圆桌周围,他们编号从 11 到 nn 顺时针排列。从某一人开始报出一个数字,其他人会按照顺时针方向顺序往后报(加一),如果某个人的数字包含 77,或者是 77 的倍数,那么他将退出游戏,下一个人继续接着报,直到剩一个人为止。

输入格式

第一行输入三个整数,nn,mm,tt。nn 代表总人数,mm 代表从第 mm 个人开始报数,他报出的数字是 tt。(1 \leq m \leq n \leq 10001≤m≤n≤1000,1 \leq t \leq 1001≤t≤100)

接下来的 nn 行,每一行输入一个字符串,代表这 nn 个人的名字,字符串的长度不超过 2020。

输出格式

输出剩下的那个人的名字,占一行。

 

 

#include<stdio.h>
#include<string.h>
#define M 10000
int main(){
    int n,m;
    long long t;
    int r=0,l=0;
    char q[M][100];
    char now[100];
    int i,j;
    scanf("%d%d%lld",&n,&m,&t);
    char name[M][100];
    for(i=0;i<n;i++){
        scanf("%s",name[i]);
        strcpy(q[r],name[r]);
        r=(r+1)%M;
    }
    for(i=0;i<m-1;i++){
        strcpy(now,q[l]);
        l=(l+1)%M;
        strcpy(q[r],now);
        r=(r+1)%M;         
    }       
    while((l+1)%M!=r){
        strcpy(now,q[l]);
        l=(l+1)%M;
        if(t%7==0||(t%1000)/100==7||(t%10)==7||(t%100)/10==7||(t%10000)/1000==7){ 
        } else {
            strcpy(q[r],now);
            r=(r+1)%M;
        }
        t++;    
    }
    printf("%s",q[l]);
    return 0;
}

### Prim算法教程与实现 #### 理解Prim算法的概念 Prim算法是一种贪心算法,用于寻找加权无向图中的最小生成树(MST)[^1]。MST是一棵连接所有顶点的子树,并且其所有边的权重之和是最小的。 #### Python代码示例 下面提供了一段Python代码来演示如何利用Prim算法构建最小生成树: ```python import sys def prim(graph, start): mst = [] # 存储最终得到的最小生成树 keys = {v: float('inf') for v in graph} # 初始化键值表,默认为无穷大 parent = {v: None for v in graph} # 记录每个节点的父亲节点 keys[start] = 0 # 起始结点到自身的距离设为零 while len(mst) != len(graph)-1: # 当mst中不包含所有的边时继续循环 min_key_node = min((k for k in keys if k not in (e[1] for e in mst)), key=lambda x:keys[x]) current_edge = (parent[min_key_node],min_key_node) mst.append(current_edge) del keys[min_key_node] for neighbor, weight in graph[min_key_node].items(): if neighbor in keys and weight < keys[neighbor]: keys[neighbor]=weight parent[neighbor]=min_key_node return mst if __name__ == '__main__': g={ 'A':{'B':7,'D':5}, 'B':{'A':7,'C':8,'D':9,'E':7}, 'C':{'B':8,'E':5}, 'D':{'A':5,'B':9,'E':15,'F':6}, 'E':{'B':7,'C':5,'D':15,'F':8,'G':9}, 'F':{'D':6,'E':8,'G':11}, 'G':{'E':9,'F':11} } result=prim(g,'A') print(result) ``` 这段程序展示了怎样通过给定的一张带权有向图`g`作为输入参数调用`prim()`函数并输出由`(u,v)`形式组成的列表表示出来的最小生成树[^2]。 #### C++代码片段展示 对于更喜欢使用静态类型的开发者来说,在C++环境下也可以很容易地编写类似的逻辑: ```cpp #include<bits/stdc++.h> using namespace std; const int MAXN = 1e3; int n,m; //n代表顶点数量,m代表边的数量 bool vis[MAXN]; //标记是否加入集合U int dis[MAXN]; //记录当前最短路径长度 vector<pair<int,int>> adj[MAXN]; void prim(){ memset(dis,0x3f,sizeof(dis)); priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq; pq.push({dis[1]=0,1}); int sumw=0,cnt=0; while(!pq.empty()){ auto [d,u]=pq.top(); pq.pop(); if(vis[u]) continue; cnt++,sumw+=d,vis[u]=true; for(auto &[v,w]:adj[u]){ if(d+w<dis[v]) pq.push({dis[v]=d+w,v}); } } cout<<(cnt==n?to_string(sumw):"-1")<<'\n'; } int main() { cin >> n >> m; for(int i=1;i<=m;++i){ int u,v,w; scanf("%d%d%d",&u,&v,&w); adj[u].emplace_back(v,w); adj[v].emplace_back(u,w); } prim(); return 0; } ``` 此版本采用了优先队列优化的方式处理大规模稀疏图的情况,使得时间复杂度降低至O(ElogV),其中E是边数而V则是顶点数目[^4]。 #### 应用场景探讨 除了经典的求解连通网络中最优传输线路外,Prim算法还能够应用于其他领域,比如机器学习当中的某些特定任务—如基于图结构的聚类分析当中就可以借助于它来进行样本间的相似关系建模。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值