PAT乙级1004可能是道傻瓜题,太简单了……根本没有技术含量……
直接贴代码,题干就是给你学生姓名、学号以及成绩,输出最高成绩的学生姓名及学号then最低的……还以为要用链表,然而并没有……暑假可能还要复习数据结构……
#include <iostream>
#include <string>
using namespace std;
int main()
{
int num;
cin>>num;
int i,mark,l_mark,h_mark;
string name,stu,l_name,h_name,l_stu,h_stu;
cin>>name>>stu>>mark;
l_name=name;l_stu=stu;l_mark=mark;
h_name=name;h_stu=stu;h_mark=mark;
for(i=1;i<num;i++)
{
cin>>name>>stu>>mark;
if(mark>h_mark)
{
h_name=name;h_stu=stu;h_mark=mark;
}
else if(mark<l_mark)
{
l_name=name;l_stu=stu;l_mark=mark;
}
else continue;
}
cout<<h_name<<" "<<h_stu<<endl;
cout<<l_name<<" "<<l_stu;
return 0;
}
PAT1005是1001的继续再升级版,但是也不难。
就是在后面的数里面找一下是否在前面的运算过程中出现过,如果出现过,那就pass;否则就标记为“关键数”,最后将关键数按照从大到小的顺序输出,并有一定的输出格式(忽略吧)。
这种时候当然用vector啦,注意添加头文件#include <vector>,然后后面用到的sort函数以及find函数,要添加头文件#include <algorithm>。
还有后面出现的一个问题就是,sort完是从小到大排列的,需要翻转一下再进行输出,reverse(ans.begin(), ans.end());
贴代码啦!!!
但是只是17/25,一会儿分析一下其他大神的!
#include<iostream>
#include <vector>
#include<algorithm>
#include<cstdlib>
using namespace std;
vector<int>sum;
vector<int>ans;
int first = 0;
int j = 0;
void test(int a)
{
vector<int>::iterator it;
int flag = 0;
if (first == 0)
{
flag = 1;
}
else
{
it = find(sum.begin(), sum.end(), a);
if (it == sum.end())
{
ans.push_back(a);
flag = 1; j ++;
}
else flag = 0;
}
while (a != 1 && flag)
{
if (a % 2 == 0)
{
a = a / 2;
sum.push_back(a);
}
else
{
a = (a * 3 + 1) / 2;
sum.push_back(a);
}
}
first++;
}
int main()
{
int num, i;
cin >> num;
sum.push_back(1);
int b;
for (i = 0; i<num; i++)
{
cin >> b;
test(b);
}
sort(ans.begin(), ans.end());
reverse(ans.begin(), ans.end());
for (int m = 0; m < j - 1;m++)
{
cout << ans[m] << " ";
}
cout << ans[j - 1];
//system("PAUSE");
return 0;
}
围观了别人的算法,大多是建立一个bool型的数组,记录这个数是否出现过。然后大多数自己写的sort……我大概比较懒吧,反正还是没找到为什么几个测试点过不去……就酱紫吧哈哈哈哈哈哈