pat1016 Phone Bills
题目不难,但输入输出数据多,格式多,需要些许思维和注意。花费了非常多时间,也算有些收获。首先,卡在输入输出上,string类型只能用cin,不能用scanf,printf ,若要用printf,只能用printf("%s",str.c_str())。输入中若带“:”,得用getchar()。在printf时,最后一个%02d少加了个%,一直报越界。要细心。此题发现,pat测试数据爱出在临界条件上,如01:02:14:58-01:02:14:59 ,若像我原本只考虑时间加头加尾加中间的,就会出错。另外,值得注意的点是,It is guaranteed that at least one call is well paired in the input. 只保证每次输入都至少有一次正确匹配,不保证每个用户都有一次正确匹配,因此可能出现有用户无一次正确匹配,此时不要输出用户的任何信息。我还是太弱了~AC代码:[cpp]//1016 13:00#include<iostream>#include<string>#include<cstdlib>using namespace std;const int NUM=1005;struct record{string name;int dd,hh,mm;string status;int total;}rec[NUM];struct call{int s;int e;double m;}cal[NUM];int toll[26];int sumToll;int cmp(const void *a, const void *b){record *x=(record *)a;record *y=(record *)b;// if(x->name==y->name&&x->dd==y->dd&&x->hh==y->hh)// return x->mm - y->mm;// if(x->name==y->name&&x->dd==y->dd)// return x->hh - y->hh;// if(x->name==y->name)// return x->dd - y->dd;// return x->name < y->name;if(x->name==y->name)return x->total - y->total;if(x->name < y->name)return -1;else return 1;}int find(int start,int end){int ans=0,i;if(rec[start].dd<rec[end].dd){for(i=rec[start].hh+1;i<24;i++){ans+=toll[i]*60;}for(i=0;i<rec[end].hh;i++)ans+=toll[i]*60;ans+=(60-rec[start].mm)*toll[rec[start].hh];ans+=rec[end].mm*toll[rec[end].hh];ans+=(rec[end].dd-rec[start].dd-1)*sumToll*60;} else if(rec[start].dd==rec[end].dd) {if(rec[end].hh>rec[start].hh){for(i=rec[start].hh+1;i<rec[end].hh;i++)ans+=toll[i]*60;ans+=(60-rec[start].mm)*toll[rec[start].hh];ans+=rec[end].mm*toll[rec[end].hh];} else {ans+=(rec[end].mm-rec[start].mm)*toll[rec[end].hh];}} elseans=-1;return ans;}int main(){int n,i,j,month;freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);sumToll=0;for(i=0;i<24;i++){cin>>toll[i];sumToll+=toll[i];}cin>>n;for(i=0;i<n;i++){//string类型只能用cin,不能用scanf,printf ,若要用printf,只能用printf("%s",str.c_str())//cin>>rec[i].name>>month>>":">>rec[i].dd>>":">>rec[i].hh>>":">>rec[i].mm>>rec[i].status;cin>>rec[i].name;cin>>month;getchar();cin>>rec[i].dd;getchar();cin>>rec[i].hh;getchar();cin>>rec[i].mm;cin>>rec[i].status;rec[i].total=rec[i].dd*60*24+rec[i].hh*60+rec[i].mm;}qsort(rec,n,sizeof(rec[0]),cmp);string str="";int start,end,flag=0;int theSame=0;rec[n].name="";double money=0.0f;int minute;double sum=0.0f;int index=0;for(i=0;i<n;i++){if(str!=rec[i].name){str=rec[i].name;flag=0;theSame=0;index=0;} elsetheSame=1;//与前一个相同if(rec[i].status[1]=='n'){//onstart=i;flag=1;//1表示前面已经出现on了}if(theSame==1&&flag==1&&rec[i].status[1]=='f'){//off 和前面是同一个end=i;补充:软件开发 , C++ ,
上一个:我的POCO C++库学习 -- 任务
下一个:二叉树
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊