1016. Phone Bills (25)

1. 原题: https://www.patest.cn/contests/pat-a-practise/1016

2. 思路:

数据处理统计题,比较繁琐。
题意是计算用户的月有效费用。
可以构建结构体,然后排序。

为求简便,这里使用map, 利用map的有序性。
注:该代码已AC
PS2:数据有效性,若1on, 2 on, 3 off, 则1会被抛弃。
无有效记录不输出。

3. 源码

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;


struct Node//每条记录的结构体
{
	bool operator< (const Node &b)
	{
		return (startTime < b.startTime);
	}
	Node(int s, int mo, int d, int h, int m, int t) : startTime(s), month(mo), dd(d),hh(h), mm(m),tag(t) {}
	int startTime;//记录的时间
	int month, dd, hh, mm;
	int tag;//0表示on-line, 1 for off-line
};

int main()
{
	freopen("in.txt", "r", stdin);
	int fare[24];
	for (int i = 0; i < 24; i++)
	{
		scanf("%d", &fare[i]);
	}
	int N;
	scanf("%d", &N);

	map<string, vector<Node> > mp;// 一个人一个vector,存储他的记录
	for (int i = 0; i < N; i++)
	{
		char tmp[25] = { 0 };
		char status[10];
		int month, dd, hh, mm;
		scanf("%s %d:%d:%d:%d %s", tmp, &month, &dd, &hh, &mm, status);
		string name(tmp);
		int start = dd * 1440 + hh * 60 + mm;
		int tag = (status[1] == 'n' ? 0 : 1);
		Node tNode(start, month, dd, hh, mm, tag);

		if (mp.count(name) > 0)
		{
			mp[name].push_back(tNode);
		}
		else
		{
			vector<Node> mv;
			mv.push_back(tNode);
			mp.insert(make_pair(name, mv));
		}
	}

	for (auto it = mp.begin(); it != mp.end(); it++)
	{
		int flag = 0;//标记是否输出该人记录,无有效通话不输出
		int Tat = 0;//该人的总金额
		sort(it->second.begin(), it->second.end());

		int size = it->second.size();
		for (int i = 0; i < size; )
		{
			if (it->second[i].tag == 0)
			{
				for (int j = i + 1; j < size; j++)
				{
					if (it->second[j].tag == 0)
					{
						i = j;
						break;
					}
					else//找到两条配对的记录
					{
						int total = 0;
						int duration = it->second[j].startTime - it->second[i].startTime;
						
						int hhs = it->second[i].dd * 24 + it->second[i].hh + 1;
						int hhe = it->second[j].dd * 24 + it->second[j].hh;
						if (hhs > hhe)//这里表示开始和结束的小时一样,单独处理
						{
							total += (it->second[j].mm - it->second[i].mm) * fare[it->second[i].hh];
						}
						else
						{
							total += (60 - it->second[i].mm) * fare[it->second[i].hh];
							total += (it->second[j].mm) * fare[it->second[j].hh];
						}

						for (int k = hhs; k < hhe; k++)
						{
							total += 60 * fare[k % 24];
						}
						Tat += total;
						if (flag == 0)
						{
							printf("%s %02d\n", it->first.c_str(), it->second[0].month);
							flag = 1;
						}
						printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",
							it->second[i].dd, it->second[i].hh, it->second[i].mm,
							it->second[j].dd, it->second[j].hh, it->second[j].mm,
							duration, total / 100.0);

						i = j + 1;
						break;
					}
				}

				if (i == size - 1)
					i++;
			}
			else
			{
				i++;
			}
		}

		if (flag == 1)
			printf("Total amount: $%.2f\n", Tat / 100.0);
	}

	return 0;
}





优化这个sql SELECT count( 1 ) FROM ( SELECT B.ID, B.PURCHASE_REQUEST_ID, B.MATERIAL_ID, B.MATERIAL_CODE, B.MATERIAL_NAME, B.STANDARD, B.MODEL_ID, B.BILL_ROW_ID, B.BILL_NO, BILL_NAME, B.MODEL_CODE, B.MODEL_NAME, B.PARENT_MODEL_ID, B.PARENT_MODEL_CODE, B.PARENT_MODEL_NAME, B.UNIT_CODE, B.UNIT_NAME, B.PURCHASE_TYPE_CODE, CAST( NVL( B.APPLY_NUM, 0 ) AS NUMBER ( 24, 10 ) ) AS APPLY_NUM, CAST( NVL( B.DEAL_NUM, 0 ) AS NUMBER ( 24, 10 ) ) AS DEAL_NUM, CAST( NVL( B.RETURN_NUM, 0 ) AS NUMBER ( 24, 10 ) ) AS RETURN_NUM, B.DEAL_USER_ID, B.DEAL_USER_NAME, CAST( NVL( B.PRICE, 0 ) AS NUMBER ( 24, 10 ) ) AS PRICE, CAST( NVL( B.AMOUNT, 0 ) AS NUMBER ( 24, 10 ) ) AMOUNT, B.IMPLEMENT_CODE, B.IMPLEMENT_NAME, B.IMPLEMENT_INVEST_AMOUNT, B.PURCHASE_MANAGER_ID, B.PURCHASE_MANAGER_NAME, B.PROVIDER_ID, B.PROVIDER_NAME, B.REMARK, B.DELIVER_AREA, B.DELIVER_ADDRESS, B.RECEIVE_PEOPLE, B.RECEIVE_PEOPLE_PHONE, B.ITEM_STATUS, B.COST_CENTER, B.COST_BUDGET_CODE, B.COST_IMPLEMENT_NAME, B.FRAME_CONT_ID, B.FRAME_CONT_CODE, B.FRAME_CONT_NAME, B.DETAIL_CONFIG, B.PURCHASE_CATEGORY_CODE, B.INVOICE_TITLE_CODE, B.INVOICE_SEND_ADDRRSS, B.MATERIAL_REQUEST_ITEM_ID, B.YEAR, B.DELETE_FLAG, B.PROVINCE_CODE, B.REASON, B.PARENT_ITEM_ID, B.FRAME_CONT_ITEM_ID, B.SUB_MATERIAL_REQUEST_ID, B.SUB_MATERIAL_REQUEST_CODE, B.MATERIAL_URL, B.RECOMMEND_PROVIDER_NAMES, C.PURCHASE_REQUEST_CODE, C.PURCHASE_REQUEST_NAME, C.APPLY_TYPE_CODE, C.CREATOR_NAME, C.APPLY_TELEPHONE, C.COMPANY_NAME, C.DEPT_NAME, B.CREATE_TIME, TO_CHAR( B.CREATE_TIME, 'YYYY-MM-DD' ) CREATE_TIME_STR, C.ARRIVE_TIME, C.IS_TO_END, C.MONEY_WAY_CODE, C.OWN, C.APPLY_CATEGORY_CODE, C.manu_Type, C.BILL_ID, MMD.MATERIAL_TYPE_CODE, B.BRANCH_COMPANY_DEAL_USER_ID, B.BRANCH_COMPANY_DEAL_USER_NAME, ( SELECT ORG_NAME FROM ORGANIZATIONS WHERE DELETE_FLAG = '0' AND ORG_CODE = ( SELECT PARENT_COMPANY_NO FROM ORGANIZATIONS WHERE ID = B.MATERIAL_DEPT_ID )) AS MATERIAL_COMPANY_NAME, B.ORIGINAL, B.PROVIDER_PRODUCT_MODEL, B.PROVIDER_PRODUCT_NAME, B.PRODUCT_DESC, B.Back_Flag, CASE WHEN MMD.material_type_code = 'WZ' THEN '1' WHEN MMD.material_type_code = 'FW' THEN '2' ELSE '3' END apply_category_code_item, NVL( C.IS_CARDSYSTEM_REQUEST, '0' ) IS_CARDSYSTEM_REQUEST, B.APPLY_GROUP_AUTHORITES, B.SCIENTIFIC_RESEARCH_ID, B.SCIENTIFIC_RESEARCH_CODE, B.SCIENTIFIC_RESEARCH_NAME, B.PREQUALFY_CODE, nvl( C.IS_QUICK, '0' ) AS IS_QUICK, C.PURCHASE_WAY_CODE, C.PURCHASE_TYPE_CODE PURCHASE_TYPE_CODE_P, C.ORIGINAL_TYPE, C.PURCHASE_REQUEST_BILLS_TYPE, B.IS_FRAME_CONT_MONAD FROM PURCHASE_REQUEST_ITEM B LEFT JOIN PURCHASE_REQUEST C ON B.PURCHASE_REQUEST_ID = C.ID LEFT JOIN MATERIAL_DATA MMD ON MMD.ID = B.MATERIAL_ID AND MMD.DELETE_FLAG = '0' WHERE B.delete_flag = '0' AND B.Item_Status IN ( 1 ) AND NOT EXISTS ( SELECT * FROM purchase_request_item_log pril WHERE B.id = pril.purchase_request_item_id AND pril.lock_status = '1' AND pril.delete_flag = '0' ) AND ( ( c.apply_type_code NOT IN ( '20', '41', '3' ) AND nvl( B.Apply_Num, 0 ) > nvl( B.Deal_Num, 0 )) OR c.apply_type_code IN ( '20', '41', '3' ) ) AND B.Deal_User_Id =: 1 AND C.MONEY_WAY_CODE =: 2 AND C.APPLY_TYPE_CODE =: 3 AND C.PAY_OUT_TYPE_CODE =: 4 AND C.APPLY_CATEGORY_CODE =: 5 AND NVL( C.IS_CARDSYSTEM_REQUEST, '0' ) = : 6 AND NOT EXISTS ( SELECT * FROM purchase_request_item p left join material_province mp ON p.material_id = mp.material_id WHERE p.delete_flag = 0 AND mp.delete_flag = 0 AND mp.material_status = 03 AND mp.org_code = p.province_code AND p.id = B.id ) ORDER BY C.ID, B.ID ASC)
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值