题目链接:https://www.nowcoder.com/pat/1/problems
1001.Rational Sum
就是分数累加,用一个0/1去累加,为了防止溢出每加一次约分一次,求最大公约数使用辗转相除法,题目规定输出的数负号只能在分子上,所以为了防止分母有负号,进行一下处理,代码如下:
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
//此函数求两个数的的最大公约数
int gcd(int x, int y)
{
return y ? gcd(y, x % y) : x;
}
int main()
{
ll a = 0, b = 1; // a代表分子, b代表分母
ll c, d; // c代表分子, d代表分母
char flag;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> c >> flag >> d;
ll aa = a*d + b*c;
ll bb = b*d;
ll g = gcd(aa, bb);
a = aa / g;
b = bb / g;
}
ll x = a / b; //判断是不是假分数
ll y = a % b; //判断分子是不是大于分母
if (b < 0)
{
a = -a; //防止分母为负数
b = -b;
}
if (a == 0)
{
cout << 0;
}
else if (x == 0)
{
cout << a << "/" << b;
}
else
{
cout << x << " ";
if (y != 0)
{
cout<< y << "/" << b;
}
}
return 0;
}
1003.List Grades
这个题就是排序,使用桶排序空间换时间,使时间复杂度O(1),然后从大到小输出,其实还可以用优先队列暴力输出,但是我嫌复杂度太大,代码如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
vector<string>name(102);
vector<string>id(102);
vector<int>grade(102); //桶排序
int n;
cin>>n;
int temp;
for(int i = 1 ; i <= n; i++)
{
cin>>name[i]>>id[i]>>temp;
grade[temp] = i;
}
int min;
int max;
cin>>min;
cin>>max;
int flag = false;
for(int i = max ; i >= min; i--)
{
if(grade[i] > 0)
{
flag = true;
cout<<name[grade[i]]<<" "<<id[grade[i]]<<endl;
}
}
if(!flag)
cout<<"NONE";
return 0;
}
1005.The Dominant Color
这个题就是在一个m*n的数据中找出现次数最多的数,我用map储存好,然后放入优先队列中(优先队列从第一个参数大到小自动排序),输出最大的那个就行,简单粗暴,代码如下:
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<queue>
using namespace std;
int main()
{
unordered_map<int, int> map;
int m, n, temp;
cin >> m >> n;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cin >> temp;
map[temp]++;
}
}
priority_queue<pair<int, int>> pq;
for (auto it = map.begin(); it != map.end(); it++)
{
pq.push(make_pair(it->second, it->first));
}
cout << pq.top().second;
return 0;
}