2021-04-01

7-17 点赞狂魔

2021-04-01_第1张图片
2021-04-01_第2张图片
输入样例:
5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14

输出样例:
jack chris john

#include 
#include 
#include 
#include 
using namespace std;
struct person {
     
	char name[10];
	int num;
	int sum;
};
bool comparison(person a, person b)
{
     
	if (a.sum != b.sum)
		return a.sum > b.sum;
	else
		return a.num < b.num;
}
int main()
{
     
	struct person a[100];
	int i, k, N,b;
	int len = 0;
	cin >> N;
	for (i = 0; i < N; i++)
	{
     
		set<int> str;
		cin >> a[i].name >> len;
		a[i].num = len;
		for (k = 0; k < len; k++)
		{
     
			cin >> b;
			str.insert(b);
		}
		a[i].sum = str.size();
	}
	sort(a, a + N, comparison);
	if (N < 3)
	{
     
		if (N == 0)
			cout << "- - -";
		else if (N == 1)
			cout << a[0].name << " - -";
		else if (N == 2)
			cout << a[0].name << a[1].name << " -";
	}
	else {
     
		for (int i = 0; i < 3; i++) {
     
			if (!i)
            cout<<a[i].name;
			else
            cout<<" "<<a[i].name;
		}
		cout<<endl;
	}
	return 0;
}


7-13 连续因子

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:
输入在一行中给出一个正整数 N(1 ​31
​​ )。

输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2*……因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:
630
输出样例:
3
5 * 6 * 7

#include 
#include 
#include 
using namespace std;
int IsPrime(long long int number)
{
     
	int i;
	if (number == 1)
		return 0;
	else
	{
     
		for (i = 2; i <= sqrt(number); i++)
		{
     
			if (number%i == 0)
				return 0;
		}
		return 1;
	}
}
int main()
{
     
	int i=0, j=0,length=0,s=1,start=0,count=0;
	int flag = 0;
	long long int number;
	cin >> number;
	if (IsPrime(number))
    {
     
     cout << "1"<<endl;
        cout<<number;
    }
	else
	{
     
		for (i = 2; i <= sqrt(number); i++)
		{
     
			s = 1;
			for (j = i; j*s <= number; j++)
			{
     
				s *= j;
				count = j;
				if (number%s == 0 && count - i + 1 > length)
				{
     
					start = i;
					length = count - i + 1;
				}
			}
		}
		cout << length<<endl;
		for (i = start; i < start + length; i++)
		{
     
				cout << i;
			if (flag<length-1)
				cout << "*";
			flag++;
		}
	}
	return 0;
}

7-21 猜数字

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:
输入在第一行给出一个正整数N(≤10
​4
​​ )。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
输出样例
22 Amy

#include 
#include 
#include 
#include 
using namespace std;
struct person {
     
	string name;
	int num;
	int cha;
};
int main()
{
     
	struct person a[10000];
	int N;
	int b[10000];
	cin >> N;
	int i=0,j,sum = 0;
	double aver=0;
	for (i = 0; i < N; i++)
	{
     
		cin >> a[i].name >> a[i].num;
		sum += a[i].num;
		aver += (a[i].num*1.0) / (N * 2);
	}
	cout << (int)aver << " ";
	set<int>s;
	for (i = 0; i < N; i++)
	{
     
		a[i].cha = abs(a[i].num - (int)aver);
		s.insert(a[i].cha);
	}
	for (j = 0; j < N; j++)
		if (a[j].cha == *(s.begin()))
			cout << a[j].name;
	return 0;
}

笔记
2021-04-01_第3张图片
s.end()表示s的最后⼀个元素的下⼀个元素所在的位置
2021-04-01_第4张图片

s.erase(1); // 删除集合s中的1这个元素

你可能感兴趣的:(C++,PTA)