做题列表
B1032 挖掘机技术哪家强(20)
#include <bits/stdc++.h>
using namespace std;
int school[100001]={0};
int main()
{
int n;
cin>>n;
int id,score;
for(int i=0;i<n;i++)
{
cin>>id>>score;
school[id]+=score;
}
int k=1,maxa=-1;
for(int i=1;i<=n;i++)
{
if(school[i]>=maxa)
{
maxa=school[i];
k=i;
}
}
cout<<k<<" "<<maxa<<endl;
return 0;
}
A1011 World Cup Betting(20)
这道题目的意思是输入三场比赛的赢,平,输的赔率(即赌博公司的赔收指数,可以理解为概率),找出每场比赛赔率的最大值,然后按公式计算得出最大的收益。最重要的是找出并输出每场比赛对应的最大值,这里用index动态记录,输入一场比赛后输出最大值。
#include <bits/stdc++.h>
using namespace std;
char s[3]={'W','T','L'};
int main()
{
double sum=1.0,temp,a;
int index;
for(int i=0;i<3;i++)
{
temp=0.0;
for(int j=0;j<3;j++)
{
cin>>a;
if(a>temp)
{
temp=a;
index=j;
}
}
cout<<s[index]<<" ";
sum*=temp;
}
sum=(sum*0.65-1)*2;
printf("%.2f",sum);
return 0;
}
这里我的做法,确实比书上繁杂了些,这里用了三个比较,其实用上边一个比较就可以。
#include <bits/stdc++.h>
using namespace std;
int main()
{
double w,t,l,sum=1.0;
int i=3;
char index;
while(i--)
{
cin>>w>>t>>l;
double maxa=0.0;
if(w>maxa)
{
maxa=w;
index='W';
}
if(t>maxa)
{
maxa=t;
index='T';
}
if(l>maxa)
{
maxa=l;
index='L';
}
sum*=maxa;
cout<<index<<" ";
}
sum=(sum*0.65-1)*2;
printf("%.2f",sum);
return 0;
}
算法逻辑正确,但是在Dev里运行,只输出一个最大值,但是提交到oj上是正确的!害我在这找了半天的错误,难道是我的dev有毛病了。
1006 Sign In and Sign Out (25分)
题意:去机房的第一个人开锁,最后一个离开的人锁门,现在有一些杂乱的签到记录,让找出第一个开锁和最后一个关锁的人的id。即需要找到签到的最早时间和最晚时间。
用scanf("%s %d:%d:%d",temp.id,&temp.hh,&temp.ff,&temp.mm);来输入 时:分:秒 的形式。这就是scanf输入的好处之一!
定义一个比较函数great,对于输入的签到时间,与signin的初始时间相比,比较之后得到的结果再与后来的输入的签到时间相比,最终得到签到时间最小的结果,同理,最终也会得到签退时间最晚的结果。
#include <bits/stdc++.h>
using namespace std;
struct room
{
char id[16];
int hh,ff,mm;
}signin,signout,temp;
bool great(room a,room b)
{
if(a.hh!=b.hh) return a.hh>b.hh;
else if(a.ff!=b.ff) return a.ff>b.ff;
else return a.mm>b.mm;
}
int main()
{
int n;
cin>>n;
signin.hh=24,signin.ff=60,signin.mm=60;
signout.hh=0,signout.ff=0,signout.mm=0;
for(int i=0;i<n;i++)
{
scanf("%s %d:%d:%d",temp.id,&temp.hh,&temp.ff,&temp.mm);
if(great(temp,signin)==false) signin=temp;
scanf("%d:%d:%d",&temp.hh,&temp.ff,&temp.mm);
if(great(temp,signout)) signout=temp;
}
printf("%s %s\n",signin.id,signout.id);
return 0;
}
A1036 Boys vs Girls (25分)
题意:要求得出女生的最高成绩,男生的最低成绩,以及女生的最高成绩减去男生的最低成绩之间的差值。
如其中没有男生或没有女生,相应输出行输出“Absent”,差值为Na。
定义两个函数,大于函数great和小于函数lesser,对于男生和女生的分数分别用大于或者小于的函数进行比较,得出男生的最低分数和女生的最高分数。并对男生女生的数量进行统计,最后根据条件进行输出。
#include <bits/stdc++.h>
using namespace std;
struct person
{
char name[11];
char sex;
char id[11];
int score;
}temp,min1,max2;
bool great(person a,person b)
{
return a.score>b.score;
}
bool lesser(person a,person b)
{
return a.score<b.score;
}
int main()
{
int n;
cin>>n;
int count1=0,count2=0;
min1.score=100,max2.score=0;
for(int i=0;i<n;i++)
{
cin>>temp.name>>temp.sex>>temp.id>>temp.score;
if(temp.sex=='M')
{
count1++;
if(lesser(temp,min1)) min1=temp;
}
else if(temp.sex='F')
{
count2++;
if(great(temp,max2)) max2=temp;
}
}
if(count1!=0 && count2!=0)
{
cout<<max2.name<<" "<<max2.id<<endl;
cout<<min1.name<<" "<<min1.id<<endl;
cout<<max2.score-min1.score<<endl;
}
else if(count1 ==0 && count2!=0)
{
cout<<max2.name<<" "<<max2.id<<endl;
cout<<"Absent"<<endl;
cout<<"NA"<<endl;
}
else if(count1!=0 && count2==0)
{
cout<<"Absent"<<endl;
cout<<min1.name<<" "<<min1.id<<endl;
cout<<"NA"<<endl;
}
return 0;
}