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;
}
}