作业比赛编号 : 1275 - 2022年春季学期《算法分析与设计》练习13

1706: 1的个数

题目描述

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。

输入

 输入一个整数(int类型)。

输出

这个数转换成2进制后,输出1的个数。

样例输入 Copy

5

样例输出 Copy

2
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
    int n;
    cin >> n;
    int count = 0;
    while (n>0) {
        if (n % 2 == 1)
        {
            count++;
        }
        n = n / 2;
    }
    cout << count << endl;
}

1702: 最小素数对

题目描述

任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。


 

输入

输入一个偶数。

输出

输出两个素数。

样例输入 Copy

20

样例输出 Copy

7
13

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>
#include<algorithm>
using namespace std;
int fun(int n)
{
    if (n == 0 || n == 1)
        return 0;
    for (int i = 2; i < n / 2; i++)
    {
        if (n % i == 0)
        {
            return 0;
            break;
        }
     
    }
     
        return 1;
}
int main() {
 
    int n;
    int i;
    cin >> n;
     
    for ( i = n/2; i>0; i--)
    {
     
        if (fun(i) && fun(n- i))
        {
            break;
        }
         
         
    }
    cout << i << endl << n - i << endl;
 
     
}

1474: 工作单位

题目描述

在某个城市中住着n个人,现在给定关于这n个人的m条信息(即某2个人认识)。

假设所有认识的人一定属于同一个单位,请计算该城市有多少个单位?

输入

第1行的第1个值表示总人数n,第2个值表示总信息数m;第2行开始为具体的认识关系信息

输出

单位的个数

样例输入 Copy

10 4
2 3
4 5
4 8
5 8

样例输出 Copy

7

#include<iostream>
#include<algorithm>
using namespace std;
int pre[1005];
int r[1005];
int c;
int findF(int x)
{
    if (x != pre[x])
        pre[x] = findF(pre[x]);
    return pre[x];
}
void Merge(int x, int y)
{
    int a = findF(x);
    int b = findF(y);
    if (a != b)
        pre[a] = b;
}
int main()
{
    int n; int m;
    while (cin>>n>>m)
    {
        int count = 0;
        for (int i = 1; i <= n; ++i)
            pre[i] = i;
        for (int i = 1; i <= m; ++i)
        {
            int x, y;
            cin >> x >> y;
    
            Merge(x, y);
        }
        for (int i = 1; i <= n; ++i)
            if (pre[i] == i)
                count++;
        cout << count << endl;
    }
    return 0;
}
 

1475: 隔离14天

输出

需要被隔离的总人数。

样例输入 Copy

100 4
2 1 2
5 10 13 11 12 14
2 0 1
2 99 2

样例输出 Copy

4
#include<algorithm>
#include<iostream>
using namespace std;
int p[1005];
int ran[1005];
int sum1;
 
void init(int x) {
    p[x] = x;
    ran[x] = 0;
}
int findF(int x) {
    if (p[x] != x)
        p[x] = findF(p[x]);
    return p[x];
}
int merge(int x, int y) {
    int a = findF(x);
    int b = findF(y);
    if (a == b)
        return 0;
    if (ran[a] > ran[b]) {
        p[b] = a;
       
    }
    else {
        p[a] = b;
  
        if (ran[a] == ran[b])
            ran[b]++;
    }
    return 1;
 
}
 
int main()
{
 
    int n, m;
    while (cin >> n >> m && (m || n)) {
 
        for (int i = 0; i <= n; i++) {
            init(i);
        }
        for (int k = 0; k < m; k++) {
            int x, y, temp;
            cin >> x >> y;
 
            for (int i = 1; i < x; i++) {
                cin >> temp;
                merge(y, temp);
            }
        }
        int C = 0;
        for (int j = 0; j < n; j++) {
            if (findF(j) == findF(0))
                C++;
 
        }
        cout << C << endl;
 
    }
}

1476: 最小生成树(Kruskal)

题目描述

编程实现Kruskal算法,求图的最小生成树(MST)的权重。

输入

每组数据分为两个部分,第一部分为图的点数n,和边数m, 
第二部分为m行,每一行输入三个数字,前两个为两个顶点的编号,第三个为边权重。 

输出

最小生成树的权重。

样例输入 Copy

3 3
0 1 10
0 2 15
1 2 50

样例输出 Copy

25
#include<algorithm>
#include<iostream>
using namespace std;
int p[1005];
int ran[1005];
int sum1;
typedef struct {
    int x, y;
     int w;
}Node;
Node node[1005];
bool cmp(Node& a, Node& b) {
    return a.w < b.w;
}
void init(int x) {
    p[x] = x;
    ran[x] = 0;
}
int findF(int x) {
    if (p[x] != x)
        p[x] = findF(p[x]);
    return p[x];
}
int merge(int x, int y, int w) {
    int a = findF(x);
    int b = findF(y);
    if (a == b)
        return 0;
    if (ran[a] > ran[b]) {
        p[b] = a;
        sum1 += w;
    }
    else {
        p[a] = b;
        sum1 += w;
        if (ran[a] == ran[b])
            ran[b]++;
    }
    return 1;
 
}
 
int main()
{
    int n, m;
    while (cin >> n >> m) {
        sum1 = 0;
        for (int i = 0; i < n; i++) {
            init(i);
        }
        for (int i = 0; i < m; i++) {
            cin >> node[i].x >> node[i].y >> node[i].w;
        }
        sort(node, node + m, cmp);
        for (int j = 0; j < m; j++) {
            merge(node[j].x, node[j].y, node[j].w);
        }
        cout << sum1 << endl;
    }
 
 
}

1767: 搭建电路

题目描述

明明迷上了一个搭建电路的游戏。
在游戏中,每次在两个电子元件之间增加一条有效电路(两个元件之间先前没有电路相连)都将获得相应的积分奖励。
已知电子元件数量n和部分电子元件之间的奖励积分值。如何构建一个有效电路将所有元件全部连接起来,并且可以得到最多的积分奖励。

输入

每组输入数据包含m+1行。
第1行输入两个正整数n和m,其中n表示电子元件数量(n<=100),m表示提供了m对电子元件之间的奖励积分值(m<=1000)。两个正整数之间用空格隔开。
第2行到第m+1行对应m对电子元件及其对应的奖励积分值,每一行包含三个正整数,第1个和第2个整数表示电子元件编号(从1开始),第3个整数表示两个元件之间搭建电路的奖励积分num(num<1e9)。整数之间用空格隔开。

输出

每组输出占1行,输出一个正整数,即最多可以得到的积分奖励值。如果没有办法把所有元件全部连接起来,则输出“No solution.”。

样例输入 Copy

3 3
1 2 10
1 3 20
2 3 30

样例输出 Copy

50
#include<algorithm>
#include<iostream>
using namespace std;
int p[1005];
int ran[1005];
long long int sum1;
typedef struct {
    int x, y;
     int w;
}Node;
Node node[1005];
bool cmp(Node& a, Node& b) {
    return a.w > b.w;
}
void init(int x) {
    p[x] = x;
    ran[x] = 0;
}
int findF(int x) {
    if (p[x] != x)
        p[x] = findF(p[x]);
    return p[x];
}
int merge(int x, int y, int w) {
    int a = findF(x);
    int b = findF(y);
    if (a == b)
        return 0;
    sum1 += w;
    if (ran[a] > ran[b]) {
        p[b] = a;
       
    }
    else {
        p[a] = b;
        if (ran[a] == ran[b])
            ran[b]++;
    }
    return 1;
 
}
 
int main()
{
    int n, m;
    int flag = 0;
    while (cin >> n >> m) {
        sum1 = 0;
        flag = 0;
        for (int i = 0; i < n; i++) {
            init(i);
        }
        for (int i = 0; i < m; i++) {
            cin >> node[i].x >> node[i].y >> node[i].w;
        }
        sort(node, node + m, cmp);
        for (int j = 0; j < m; j++) {
            if (merge(node[j].x, node[j].y, node[j].w))
            {
                flag++;
            }
        }
        if (flag == n - 1)
            cout << sum1 << endl;
        else
            cout << "No solution." << endl;
    }
 
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值