好久没有代码,感觉自己好多东西东忘了,这两天上牛客网刷了几道题。
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
//这道题我一开始也是想自己构建一个包含名字和成绩的struct,后来在讨论区看到一种更加简单的做法
//由于成绩分布在0-100之间,因此可以直接弄一个列为101的二维vector>
//按照顺序输出即可,不需要排序,算法复杂度为O(n)
#include
#include
#include
using namespace std;
struct stu {
string name;
unsigned int grade;
};
void sort(vector &, int);
int main()
{
int num, way;
while (cin >> num >> way){
vector v;
for (auto i = 0; i < num; ++i){
stu s;
cin >> s.name >> s.grade;
v.push_back(s);
}
sort(v, way);
}
}
void sort(vector &v, int way){
if (v.empty() || (way != 1 && way != 0))
return;
int max = 0;
int beg, end;
for (auto p = v.begin(); p != v.end(); ++p)
max = max < (*p).grade ? (*p).grade : max;
if (way == 0){
for (int i = max; i >= 0; --i){
for (auto p = v.begin(); p != v.end(); ++p){
if ((*p).grade == i)
cout << (*p).name << " " << (*p).grade << endl;
}
}
}
else if (way == 1){
for (int i = 0; i <= max; ++i){
for (auto p = v.begin(); p != v.end(); ++p){
if ((*p).grade == i)
cout << (*p).name << " " << (*p).grade << endl;
}
}
}
}
输入n个整数,依次输出每个数的约数的个数
#include
#include
#include
using namespace std;
int divisor(int num){
int factor = 0;
int i;
for(i = 1; i*i < num; i++){//避免统计重复因子
if(num%i ==0)
factor+=2;//两个因子都加进去了
}
if(i*i==num)
factor++;
return factor;
}
int main(){
int N;
while(cin >> N){
int num;
for(int i = 0; i < N; i++){
cin >> num;
cout << divisor(num) << endl;
}
}
return 0;
}
求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
//任意一个整数都可以分解成质因数的幂的乘积,因此我们对其进行整除即可,注意对于每个数,都整除到不能进行整除为止
//不需要考虑因素是非素数的情况,因为非素数都能被素数整除
#include
#include
using namespace std;
int main(){
long M;
while(cin >> M){
int cnt = 0;
for(int j = 2; j <= sqrt(M); j++){
while(M%j==0){//用while整除到不能整除为止
M = M/j;
cnt++;
}
if(M <= 1)
break;
}
if(M > 1)
cnt++;
cout << cnt << endl;
}
}
一个整数总可以拆分为2的幂的和,例如:
7=1+2+4
7=1+2+2+2
7=1+1+1+4
7=1+1+1+2+2
7=1+1+1+1+1+2
7=1+1+1+1+1+1+1
总共有六种不同的拆分方式。 再比如:4可以拆分成:
4 = 4
4 = 1 + 1 + 1 + 1
4 = 2 + 2
4=1+1+2
用f(n)表示n的不同拆分的种数,例如f(7)=6. 要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。
/*dp[i]表示f(i)
状态转移方程
i是奇数:dp[i]=dp[i-1]
i是偶数:dp[i]=dp[i-1]+dp[i/2] 其中dp[i-1]表示拆分有1的种数,dp[i/2]表示拆分没有1的种数
*/
//注意在运算的过程中也要进行取模运算,不然数据太大会出现溢出
#include
using namespace std;
long f[1000001];
long func(long n){
f[1] = 1;
for(int i = 2; i <= n; i++){
if(i%2==1)
f[i] = f[i - 1]%1000000000;
else if(i%2==0)
f[i] = f[i - 1]%1000000000 + f[i/2]%1000000000;
}
return f[n];
}
int main(){
int N;
while(cin >> N){
cout << func(N)%1000000000 << endl;
}
}
用一维数组存储学号和成绩,然后,按成绩排序输出。
//由于题目要求用以为数组来存储数据,因此我们可以自己构建一个struct,自定义学号和成绩
//由于在题目中要求我们对于成绩进行排序输出,并且对于同一成绩的,要求按照学号大小排序输出,因此我们可以自己写一个比较cmp
#include
#include
#include
using namespace std;
struct student{
int id;
int score;
};
bool cmp(student a, student b){
if(a.score < b.score)
return true;
if(a.score == b.score && a.id < b.id)
return true;
return false;
}
int main(){
int N;
while(cin >> N){
vector stu;
for(int i = 0; i < N; i++){
student s;
cin >> s.id >> s.score;
stu.push_back(s);
}
sort(stu.begin(), stu.end(), cmp);
for(int i = 0; i < stu.size(); i++){
cout << stu[i].id << " " << stu[i].score << endl;
}
}
}
输入球的中心点和球上某一点的坐标,计算球的半径和体积
//注意球的体积公式是4/3*pi*r*r*r
//数据要使用double的形式
//设置精度的问题
#include
#include
#include
#include//设置精度需要添加这个库文件
using namespace std;
int main(){
double x0, y0, z0, x1, y1, z1;
while(cin >> x0 >> y0 >> z0 >> x1 >> y1 >> z1){
double r, v;
r = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0) + (z1-z0)*(z1-z0));
v = (4.0/3)*acos(-1)*r*r*r;
cout << fixed << setprecision(3) << r << " " << v << endl;//注意设置精度
}
}