闲着无聊,写一写模拟题单最后一题Milk Measurement的题解

ID_15265 Milk Measurement

时间限制: 2000ms 空间限制: 262144kB

题目描述

Farmer John养了三头奶牛:Bessie,Elsie和Mildred,每头奶牛最初每天产生7加仑的牛奶。由于奶牛的产奶量可能随时间变化,Farmer John在接下来的100天内进行了定期测量,并在他的日志中记录下来。他的日志条目如下所示:

第一条记录表示在第35天,Bessie的产奶量比上次测量时低了2加仑。下一条记录表示在第14天,Mildred的产奶量比上次测量时增加了3加仑。Farmer John每天最多只能进行一次测量。不幸的是,他有点杂乱无章,并且不一定按照时间顺序记录测量结果。

为了保持奶牛的积极性,Farmer John自豪地在牲口棚的墙上展示了当前产奶量最高的奶牛的照片(如果有多头奶牛产奶量并列最高,则展示所有照片)。请确定Farmer John需要更换显示器的天数。

输入格式

输入描述:
第一行输入包含N,表示Farmer John进行的测量次数。接下来的N行每行包含一次测量,格式如上所述,指定一天(范围在1到100之间的整数),一头奶牛的名字和自上次测量以来奶量的变化(非零整数)。每头奶牛的产奶量始终在0到1000的范围内。

输出格式

输出描述:
请输出Farmer John需要调整他的显示器的天数(范围在0到100之间的整数)。

样例

Input 1

4
7 Mildred +3
4 Elsie -1
9 Mildred -1
1 Bessie +2

Output 1

3

样例解释

测试样例解释:
最初,所有奶牛的产奶量都是7。在第1天,Bessie的产奶量增加到9,使她成为产奶量最高的奶牛,并导致Farmer John更换了显示。在第4天,Elsie的产奶量减少到6,但这并不改变Bessie是唯一领先的事实。在第7天,Mildred跃居领先地位,更改了显示器,而在第9天,Mildred的产量下降与Bessie并列,再次更改了显示器。

数据范围

数据范围:
Farmer John进行的测量次数N范围在0到100之间。每头奶牛的产奶量始终在0到1000的范围内。

题解:

我们编程是这样的,Farmer John只需出题并看奶牛就好了,而我们写题的要考虑的就很多了
又是万恶的Farmer John(悲),题目意思明确,是指Farmer John在不定时测量奶牛的出奶量,如果有几只奶牛出奶量处于领先的状态,Farmer John就会将那几只奶牛的照片挂在显示器上,而我们需要求出Farmer John更换了几次显示屏
这道题一看就是模拟 (毕竟在模拟题单里) ,看到输入样例,每行(除第一行)格式相同,为了方便可以开一个结构体

struct cow{
    int day;//记录日期
    char name[10];//记录奶牛名字
    string change;//记录产奶量的变化
}a[105];

又因为输入的天数无序,所以这里还需要sort函数
sort函数在

#include<algorithm>

这个头文件里,或者说你用万能头

#include<bits/stdc++.h>

就不需要了
结构体数组不能直接排序,所以这里需要一个cmp函数帮助我们排序
此题是按照天数排序的,所以我们cmp函数该写成如下

bool cmp(cow a,cow b){
    return a.day<b.day;
}

结构体之类东西都弄好了,接下来就是主函数了
由于只有三只奶牛且它们最初的出奶量都为7加仑,我们可以设置b(表示Bessie),e(表示Elsie),m(表示Mildred)三个变量,且都初始化为7,表示它们出奶量,用于比较
接下来我们会用到三个函数:strlen(字符数组名),stoi(string字符串),字符串(string类型).substr(起始值,长度(不填默认到末尾))
strlen函数作用是获取char类型字符数组的长,stoi是将string类型字符串(这个字符串里必须要是string类型的数字!!!)转化为int类型,substr是将字符串从你填的第一个值(这个值为字符串起始下标)到往后你填的第二个值(长度)的长度的切割完的字符串返回
如果不用万能头,那么你需要

#include<string.h>(strlen)
#include<string>(后两个函数)

先给结构体数组排序,紧接着遍历一遍,(使用strlen)如果遍历到的结构体数组中的"name"是6个字符,那么判断+或-的奶量,先用a[i].change[0]=='+'或a[i].change[0]=='-'判断产奶量增加或减少
再使用stoi(a[i].change.substr(1))(因为产奶量位数不同,所以使用substr),将产奶量增加或减少的部分获取出来,再给对应的变量进行加减,例如

if(strlen(a[i].name)==6){
     if(a[i].change[0]=='+') b+=stoi(a[i].change.substr(1));
     else b-=stoi(a[i].change.substr(1));
}

接下来是判断显示屏是否相同,这里我们新建一个字符数组string flag[105]用于存储每次Farmer John挂在显示屏上的照片,此处只需要做一些判断,如

if(b>m&&b>e) flag[i]="b";
else if(m>b&&m>e) flag[i]="m";
else if(e>b&&e>m) flag[i]="e";
else if(b>m&&e>m&&b==e) flag[i]="be";
else if(m>b&&e>b&&m==e) flag[i]="me";
else if(b>e&&m>e&&b==m) flag[i]="bm";
else flag[i]="bme";

最后进行判断,增加一个计数器sum
如果flag[i]不等于flag[i-1],那么计数器sum++
最后的最后,我们输出sum,即可拿下一个AC惹~
(实际上我做这题时想s了Farmer John :rage: :rage: :rage:

提交记录(对我来说是有点难(悲)):

核心代码(伪代码,直接交包你compile error):

#include<bits/stdc++.h> //万能头
using namespace std;  //std命名空间
struct cow{   //结构体
    int day;   //天数
    char name[7];  //奶牛名字
    string change;  //产奶量变化
}a[105]; //结构体数组
bool cmp(cow a,cow b){  //排序函数
    return a.day<b.day;
}
int main(){
    int n,b=7,e=7,m=7,s=0;
    string flag[105]; //定义部分
    //输入部分
    //排序
    for(int i=1;i<=n;i++){
        if(strlen(a[i].name)==6){  //示例(Bessie部分)
            if(a[i].change[0]=='+') b+=stoi(a[i].change.substr(1));
            else b-=stoi(a[i].change.substr(1));
        }
        else if(strlen(a[i].name)==7){
            //Mildred部分        
        }
        else{
            //Elsie部分
        }
        //判断部分
        if(flag[i]!=flag[i-1]) s++;  //计数器
    }
    //输出s
    return 0;   //好习惯
}
//linan04053原创,禁止搬运或抄袭
//若有优化可以发在后面(可能会给解决方案),本人蒟蒻,写的不好,不喜勿喷,给帖子点个赞吧~
1 个赞

有好的优化方法可能会给题解awa

1 个赞