结构体也是比较常考察的内容,大家务必学会。
1.7018 输出最高分数的学生姓名
第一题不用结构体排序就可以了,用了反而要担心最大的是不是编号小的。
第一个在不在前面,与排序的稳定性有关。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
//设置一个到不了的值
int M=-1;
string ans;
for(int i=1;i<=n;i++)
{
int x;
string t;
cin>>x>>t;
if(x>M)
{
M=x;
ans=t;
}
}
cout<<ans<<endl;
}
return 0;
}
2.6961 奥运奖牌榜
这就是一道中规中矩的结构体排序了,需要我们写出cmp函数
#include <bits/stdc++.h>
using namespace std;
struct Country
{
int id;
string name;
int person,gold,silver,bronze,total;
int input_id;
}a[105];
int cmp(Country a,Country b)
{
if(a.total==b.total)return a.name<b.name;
return a.total<b.total;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].id>>a[i].name>>a[i].person>>a[i].gold>>a[i].silver>>a[i].bronze>>a[i].total;
a[i].input_id=i;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
cout<<a[i].name<<" "<<a[i].total<<"
";
}
return 0;
}
3.5617 看电视
本题是大学生期末考试题,有一些小坑。正式比赛仅有一次机会,请养成好习惯,将问题思考清楚,一遍AC。
我们需要把时间转换为是今天的第几秒,因为没有前导0,不能直接按字典序。
#include<bits/stdc++.h>
using namespace std;
struct line
{
int pd;
int h,m;
string name;
}a[6];
bool cmp(line x,line y)
{
if(x.pd!=y.pd) return x.pd<y.pd;
if(x.h!=y.h) return x.h<y.h;
return x.m<=y.m;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
char k;
cin>>a[i].pd>>a[i].h>>k>>a[i].m>>a[i].name;
}
sort(a,a+n,cmp);
string s;
cin>>s;
int flag=0;
for(int i=0;i<n;i++)
{
if(a[i].name==s)
{
cout<<a[i].pd<<" "<<a[i].h<<":";
printf("%02d
",a[i].m);
flag=1;
}
}
if(flag==0)cout<<"no data
";
}
return 0;
}
4.5022 德才论
1.可以设置个标记,比如才德全尽设为1,然后德胜才设为2,依次类推
2.也可以开几个数组分别排序
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct T
{
int id,de,cai;
int flag;
}t,a[N];
int cmp(T a,T b)
{
if(a.flag!=b.flag)
return a.flag<b.flag;
if(a.de+a.cai!=b.de+b.cai)
return a.de+a.cai>b.de+b.cai;
if(a.de!=b.de)return a.de>b.de;
return a.id<b.id;
}
int main()
{
int n,l,h;
cin>>n>>l>>h;
int tot=0;
for(int i=0;i<n;i++)
{
cin>>t.id>>t.de>>t.cai;
if(t.de<l||t.cai<l)continue;
if(t.de>=h&&t.cai>=h)t.flag=1;
else if(t.de>=h)t.flag=2;
else if(t.de<h&&t.cai<h&&t.de>=t.cai)t.flag=3;
else t.flag=4;
a[tot++]=t;
}
sort(a,a+tot,cmp);
cout<<tot<<"
";
for(int i=0;i<tot;i++)
{
cout<<a[i].id<<" "<<a[i].de<<" "<<a[i].cai<<"
";
}
return 0;
}
5.6158 奖学金评比
条件相对较少,实际上可能比前两题还简单
#include <bits/stdc++.h>
using namespace std;
struct T
{
int n,d,z,nen,t,num;
string name;
}a[301];
int cmp(T a,T b)
{
if(a.num!=b.num) return a.num>b.num;
if(a.d!=b.d) return a.d>b.d;
if(a.z!=b.z) return a.z>b.z;
if(a.nen!=b.nen) return a.nen>b.nen;
return a.n<b.n;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].n>>a[i].name>>a[i].d>>a[i].z>>a[i].nen>>a[i].t;
a[i].num=0.2*a[i].d+0.2*a[i].nen+0.05*a[i].t+0.55*a[i].z;
}
sort(a,a+n,cmp);
cout<<a[0].n<<" "<<a[0].name;
return 0;
}
6.4894 竞赛排名
条件较多,公式较为复杂,可以先算出再排序。
#include <bits/stdc++.h>
using namespace std;
struct stures
{
int id;
double yv, sumv;
} res[1005];
bool cmp(stures r1, stures r2)
{
if (r1.yv != r2.yv)
return r1.yv > r2.yv;
else if (r1.sumv != r2.sumv)
return r1.sumv > r2.sumv;
else
return r1.id < r2.id;
}
int main()
{
int n, x[1005][10] = {};
double y[1005][10] = {}, avg[10] = {};
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < 8; j++)
cin >> x[i][j]; // 输入
for (int i = 0; i < 8; i++)
{ // 算均分
for (int j = 0; j < n; j++)
avg[i] += x[j][i];
avg[i] /= n;
}
for (int i = 0; i < 8; i++)
for (int j = 0; j < n; j++)
{ // 算位置分
for (int k = 0; k < n; k++)
y[j][i] += abs(x[k][i] - avg[i]);
if (y[j][i] != 0)
y[j][i] = (x[j][i] - avg[i]) / (y[j][i] / n);
}
for (int i = 0; i < n; i++)
{ // 算总位置分
res[i].id = i;
res[i].sumv = 0;
for (int j = 0; j < 3; j++)
res[i].yv += y[i][j];
for (int j = 3; j < 8; j++)
res[i].yv += 0.8 * y[i][j];
}
for (int i = 0; i < n; i++)
for (int j = 0; j < 8; j++) // 算总分
res[i].sumv += x[i][j];
sort(res, res + n, cmp);
for (int i = 0; i < n; i++)
cout << res[i].id + 1 << endl; // 输出
return 0;
}