《算法笔记》胡凡——3.2查找元素

做题列表

在这里插入图片描述

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;
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值