第一题
交换打印顺序即可
第二题
数字排序一开始我用的vector<pair<int,int>> v 做的,答案一模一样但是不知道为什么不能AC;
运算符重载:只要在定义的结构体内重载运算符 < 即可
struct x{
int a, b;
bool operator < ( const x &t) const
{
if( a != t.a)
return a < t.a; //优先按a升序排序
return b < t.b; //a相同则按b升序排序
}
}
整体代码:
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1010
int h[N];
struct data
{
int val, cnt;
bool operator < (const data& t) const
{
if (cnt == t.cnt)
return val < t.val;
return cnt > t.cnt;
}
}q[N];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
h[x]++;
}
n = 0;
for (int i = 0; i < N; i++) {
if (h[i])
{
q[n++] = { i, h[i] };
}
}
sort(q, q + n);
for (int i = 0; i < n; i++) {
printf("%d %d\n", q[i].val, q[i].cnt);
}
return 0;
}
第三题
获得这个月的天数的函数
int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//判断是不是闰年,如果是则返回1,直接用来给2月来加1
int isLeapYear(int y)
{
if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0)
return 1;
return 0;
}
//获取y年m月有多少天
int days(int y, int m)
{
if( y == 2 && isLeapYear(y) )
return month[m] + 1;
return month[m];
}
第四题
最终目标可抽象为:一个有向图,从每个结点出发,找到距离它最远和次远的两个结点的距离之和;
图的加边算法:增加一条从a顶点到b顶点的边
int h[N], e[N], ne[N], idx;
void add( int a, int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
注意:e[N]中存的是顶点下标
ne[N]和h[N]中存的都是边的下标
因此遍历结点a的函数时,每次用i存储临边的下标,用j存储邻接顶点的下标
for( int i = h[a]; ~i; i = ne[i]){
int j = e[i];
//do something
}