带刷,带刷,刷起来!!!(二)

简介: 带刷,带刷,刷起来!!!

 D:::::::::::::::::::发现环(并查集,DFS)


题目描述

小明的实验室有 N 台电脑,编号 1⋯N。原本这 N 台电脑之间有N−1 条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。


不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了 BUG。


为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗?


输入描述

输入范围:


第一行包含一个整数 N 。


以下 N 行每行两个整数 a,b,表示 a 和 b 之间有一条数据链接相连。


其中, 1≤N≤105,1≤a,b≤N。


输入保证合法。


输出描述

按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。


输入输出样例

示例


输入

5
1 2
3 1
2 4
2 5
5 3

输出

1 2 3 5
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
int fa[100005];
bool vis[100005];
int find(int x){
  if(fa[x]==-1) return x;
  return fa[x]=find(fa[x]);
}
vector<int> s[100005];
int qi,end1;
int flage;
bool pl;
int j[100005];
int mm=0;
void print(int step)
{
    sort(j+1,j+1+step);
    for(int i=1;i<=step;i++)
      cout<<j[i]<<" ";
}
void dfs(int x,int step)
{
    vis[x]=1;
    j[step]=x;
    if(x==end1){
      print(step);
      return;
    }
    for(int i=0;i<s[x].size();i++)
        if(!vis[s[x][i]]){
          dfs(s[x][i],step+1);
        }
}
int main(){
  cin>>n;
  memset(fa,-1,sizeof(fa));
  for(int i=0;i<n;i++){
    int a,b;
    cin>>a>>b;
    if(find(a)==find(b)){
      qi=a,end1=b;
    }else{
    fa[find(a)]=b;
        s[a].push_back(b);
    s[b].push_back(a);
    }
  }
  dfs(qi,1);
  return 0;
}

 E:::::::::::::::::::大臣的旅费(双DFS)


题目描述

很久以前,T 王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。


为节省经费,T 国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。


J 是 T 国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了 J 最常做的事情。他有一个钱袋,用于存放往来城市间的路费。


聪明的 J 发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第 x 千米到第 x +1 千米这一千米中( x 是整数),他花费的路费是 x +10 这么多。也就是说走 1 千米花费 11,走 2 千米要花费 23。


J 大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?


输入描述

输入的第一行包含一个整数 n,表示包括首都在内的 T 王国的城市数。


城市从 1 开始依次编号,1 号城市为首都。


接下来 n -1 行,描述 T 国的高速路( T 国的高速路一定是 n -1 条)。


每行三个整数 Pi,Qi,Di,表示城市 P_iPi 和城市 Qi 之间有一条高速路,长度为 Di 千米。


输出描述:

输出一个整数,表示大臣 J 最多花费的路费是多少。


输入输出样例

示例


输入

5
1 2 2
1 3 1
2 4 5
2 5 4

输出

135

样例说明


大臣 J 从城市 4 到城市 5 要花费 135 的路费。


这道题好恶心,用dfs最后一个例题,数值较大,开足内存卡内存,不开内存,运行错误,用两遍dfs。


单个:80%

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
int a[1010][1010];
vector<int> g[10010];
int c;
bool vis[10010];
long long ans;
long long p;
void dfs(int qi,int zhong,long long bu){
  if(bu>ans){
    return;
  } 
  if(qi==zhong){
    ans=min(ans,bu);
    p=max(p,ans);
    return;
  }
  int len=g[qi].size();
  for(int i=0;i<len;i++){
    if(!vis[g[qi][i]]){
      vis[g[qi][i]]=1;
      dfs(g[qi][i],zhong,bu+a[qi][g[qi][i]]);
      vis[g[qi][i]]=0;
    }
  } 
}
int main(){
  cin>>n;
  if(n==1 || n==0){
    cout<<0;
    return 0;
  }
  for(int i=1;i<n;i++){
    int p,q,d;
    cin>>p>>q>>d;
    a[p][q]=a[q][p]=d; 
    g[p].push_back(q);
    g[q].push_back(p);
  }
  for(int i=1;i<=n;i++){
    for(int j=i+1;j<=n;j++){
      ans=1e9;
      vis[i]=1;
      dfs(i,j,0);
      vis[i]=0;
      c++;
    }
  }
  cout<<p*10+p*(p+1ll)/2;
  return 0;
} 


两遍:

#include <iostream>
#include<vector>
using namespace std;
const int N =100010;
int n;
struct Edge
{
  int id,w;
};
vector<Edge> h[N];
int dist[N];
void dfs(int u,int father,int distance)
{
  dist[u] = distance;
  for(auto node : h[u])   
    if(node.id!= father)   
      dfs(node.id,u,distance + node.w);
}
int main()
{
  scanf("%d",&n);
  for(int i=0;i<n-1;i++)
  {
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    h[a].push_back({b,c});  
    h[b].push_back({a,c});  
  }
  dfs(1,-1,0); 
  int u=1;
  for(int i=1;i<=n;i++)
    if(dist[i]>dist[u]) u=i;
  dfs(u,-1,0);
  for(int i=1;i<=n;i++)
    if(dist[i]>dist[u]) u=i;
 int v = dist[u];
printf("%lld\n",10*v + v*(v+1ll)/2);
  return 0;
}

 F:::::::::::::::::::最小公倍数(高精度)


题目描述

为什么 1 小时有 60 分钟,而不是 100 分钟呢?这是历史上的习惯导致。


但也并非纯粹的偶然:60 是个优秀的数字,它的因子比较多。


事实上,它是 1 至 6 的每个数字的倍数。即 1,2,3,4,5,6 都是可以除尽 60。


我们希望寻找到能除尽 1 至 n 的的每个数字的最小整数。


不要小看这个数字,它可能十分大,比如 n = 100, 则该数为:


69720375229712477164533808935312303556800


输入描述

输入一个数字 (N<100)。


输出描述

输出出 1 ~ nn 的最小公倍数。


输入输出样例

示例


输入

6

输出

60
 #include<iostream>
#include<cstring>
using namespace std;
int prime[101],ans=0;
void prime_it(){
    for(int i=1;i<=100;i++)prime[i]=i;
    for(int i=2;i<=100;i++){
        for(int j=2;j<=i-1;j++)if(prime[i]%prime[j]==0)prime[i]/=prime[j];
    }
}
int num[101],len=1;
int main(){
    int n;
    prime_it();
    while(cin>>n){
        memset(num,0,sizeof(num));
        num[1]=1,len=1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=len;j++){
                num[j]*=prime[i];
            }
            for(int j=1;j<=len;j++){
                num[j+1]+=num[j]/10;
                num[j]%=10;
            }
            while(num[len+1]){
                len++;
                num[len+1]=num[len]/10;
                num[len]%=10;
            }
        }
        for(int i=len;i>=1;i--)cout<<num[i];
        cout<<endl;
    }
    return 0;
} 

  G:::::::::::::::::::排列叙述(全排列)


题目描述

如果用 a b c d 这 4 个字母组成一个串,有 4!=24 种,如果把它们排个序,每个串都对应一个序号:


abcd 0


abdc 1


acbd 2


acdb 3


adbc 4


adcb 5


bacd 6


badc 7


bcad 8


bcda 9


bdac 10


bdca 11


cabd 12


cadb 13


cbad 14


cbda 15


cdab 16


cdba 17



现在有不多于 10 个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?


输入描述

输入一行,一个串。


输出描述

输出一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是 0。


输入输出样例

示例


输入

bdca

输出

11
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string arr;
long long ans=0;
int main(){
  cin>>arr;
  string arr1=arr;
  sort(arr1.begin(),arr1.end());
  if(arr1==arr){
    cout<<0;
    return 0;
  }
  while(next_permutation(arr1.begin(),arr1.end())){
    if(arr1==arr){
      break;
    }
    ans++;
  }
  cout<<ans+1;
  return 0;
}
相关文章
|
3天前
|
机器学习/深度学习 人工智能 算法
解密巴黎奥运会中的阿里云AI技术
2024年巴黎奥运会圆满结束,中国代表团金牌数与美国并列第一,展现了卓越实力。阿里云作为官方云服务合作伙伴,通过先进的AI技术深度融入奥运的各项环节,实现了大规模的云上转播,超越传统卫星转播,为全球观众提供流畅、高清的观赛体验。其中,“子弹时间”回放技术在多个场馆的应用,让观众享受到了电影般的多角度精彩瞬间。此外,8K超高清直播、AI智能解说和通义APP等创新,极大地提升了赛事观赏性和互动性。能耗宝(Energy Expert)的部署则助力实现了赛事的可持续发展目标。巴黎奥运会的成功举办标志着体育赛事正式进入AI时代,开启了体育与科技融合的新篇章。
解密巴黎奥运会中的阿里云AI技术
|
10天前
|
开发框架 自然语言处理 API
基于RAG搭建企业级知识库在线问答
本文介绍如何使用搜索开发工作台快速搭建基于RAG开发链路的知识库问答应用。
7595 16
|
17天前
|
弹性计算 关系型数据库 Serverless
函数计算驱动多媒体文件处理:高效、稳定与成本优化实践
本次测评的解决方案《告别资源瓶颈,函数计算驱动多媒体文件处理》展示了如何利用阿里云函数计算高效处理多媒体文件。文档结构清晰、内容详实,适合新客户参考。方案提供了一键部署与手动部署两种方式,前者简便快捷,后者灵活性高但步骤较多。通过部署,用户可体验到基于函数计算的文件处理服务,显著提升处理效率和系统稳定性。此外,测评还对比了应用内处理文件与函数计算处理文件的不同,突出了函数计算在资源管理和成本控制方面的优势。
22674 19
|
11天前
|
SQL 分布式计算 数据库
畅捷通基于Flink的实时数仓落地实践
本文整理自畅捷通总架构师、阿里云MVP专家郑芸老师在 Flink Forward Asia 2023 中闭门会上的分享。
8197 14
畅捷通基于Flink的实时数仓落地实践
|
18天前
|
机器学习/深度学习 存储 人工智能
提升深度学习性能的利器—全面解析PAI-TorchAcc的优化技术与应用场景
在当今深度学习的快速发展中,模型训练和推理的效率变得尤为重要。为了应对计算需求不断增长的挑战,AI加速引擎应运而生。其中,PAI-TorchAcc作为一个新兴的加速引擎,旨在提升PyTorch框架下的计算性能。本文将详细介绍PAI-TorchAcc的基本概念、主要特性,并通过代码实例展示其性能优势。
17693 147
|
11天前
|
前端开发 Java Go
关于智能编码助手【通义灵码】,开发者们这么说...
现在通过体验活动首次完成通义灵码免费下载及使用的新用户,即可获得限量定制帆布包 1 个;分享体验截图到活动页面,还可参与抽奖活动,iPhone15 手机、机械键盘、智能手环等大奖等你拿!
7158 11
|
13天前
|
人工智能 JSON Serverless
【AI 冰封挑战】搭档函数计算,“冰”封你的夏日记忆
夏日炎炎,别让高温打败你的创意,立即体验 ComfyUI 自制冰冻滤镜!无需繁琐的后期技巧,三步开启一段清凉无比的视觉探险。参与实验并上传作品即可获得运动无线蓝牙耳机,限量 800 个,先到先得!
8247 11
|
19天前
|
人工智能 运维 Cloud Native
实战基于阿里云的AIGC在运维领域的探索
传统运维模式已难以应对日益复杂的海量数据和业务需求,效率低下,故障难解。而人工智能的崛起,特别是AIGC技术的出现,为运维领域带来了新的机遇。AIGC能够自动生成运维脚本、分析海量数据,预测潜在故障,甚至提供解决方案,为运维工作注入智能化力量,推动运维向更高效、更智能的方向发展。
16242 18
实战基于阿里云的AIGC在运维领域的探索
|
20天前
|
机器学习/深度学习 自然语言处理 算法
未来语音交互新纪元:FunAudioLLM技术揭秘与深度评测
人类自古以来便致力于研究自身并尝试模仿,早在2000多年前的《列子·汤问》中,便记载了巧匠们创造出能言善舞的类人机器人的传说。
11485 112
|
27天前
|
存储 SQL OLAP
分析性能提升40%,阿里云Hologres流量场景最佳实践
分析性能提升40%,阿里云Hologres流量场景最佳实践