题目二十三

题目:Phone Bills
我的代码:
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;

typedef struct{
    string name;
    map<string,string>time;
}consumer;

//根据名字排序
bool cmp(consumer c1,consumer c2){
    return c1.name < c2.name;
}

//计算时间和话费 
int trans(string sta,string end,int cent[],int &time,float &amount){
	int day,hour,min;
	min = stoi(sta.substr(9,2));
	hour = stoi(sta.substr(6,2));
	day = stoi(sta.substr(3,2));
    while(day<stoi(end.substr(3,2)) || hour<stoi(end.substr(6,2)) || min<stoi(end.substr(9,2))){
    	min++;
    	time++;
    	amount += cent[hour];
    	if(min == 60){
    		min = 0;
    		hour++;
		}
		if(hour == 24){
			hour = 0;
			day++;
		}
	} 
}


int main(){
    consumer cos[1000];
    int cent[25],N,sum = 0,min = 0;//sum是指真正有多少个人,min是指通话时长
    float cost;
    float amount = 0; //总共话费
    map<string,int>mp; 
    
    for(int i = 0;i < 24;i++){
        cin>>cent[i];
    }
    cin>>N;
    
    for(int i = 0;i < N;i++){  
        string s1,s2,s3;
        cin>>s1>>s2>>s3;
        auto it = mp.find(s1);
        if(it == mp.end()){ //还没有添加的用户 
        	cos[sum].name = s1;
        	cos[sum].time[s2] = s3; 
        	mp[s1] = sum; 
        	sum++;
		}
		else{
        	cos[it -> second].time[s2] = s3;
		}
    }
    
    //cout<<sum<<endl;
    sort(cos,cos+sum,cmp);
    int flag = 0;
    int on1 = 1;
    int on2 = 1;
    for(int i = 0;i < sum;i++){   //三重循环,感觉会爆
        auto it1  = cos[i].time.begin();
        auto it2  = cos[i].time.begin();
        for( ;it1 != cos[i].time.end();it1++){
        	min = amount = 0;
        	auto it2  = it1;
        	it2--;
            if(it1 -> second == "off-line" && it2 -> second == "on-line"){
                flag=1;
                if(on1 == 1){
                    cout<<cos[i].name<<' '<<it1  -> first.substr(0,2)<<endl;
                    on1++;
                }
                trans(it2 ->first,it1 ->first,cent,min,amount); 
                //cout<<amount<<endl;
                cout<<it2 ->first.substr(3,11)<<' ';
                cout<<it1 ->first.substr(3,11)<<' ';
                cout<<min<<' '<<"$";
                printf("%.2f\n",amount/100);
                cost += amount;
            }
        }
        if(flag == 1 && on2 == 1){
            printf("Total amount: $%.2f\n",cost/100);
            on2++;
        }
        cost = flag = 0;
        on1 = on2 = 1;
    }
    return 0;
}

评注:计算费用那里的思路比较经典

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值