贴个没用map的代码测试,测试点1和2都没过,调整下代码应该可以把测试点1过了(但我找了半天没找出错误点!)
测试点 | 结果 | 耗时 | 内存 |
---|---|---|---|
0 | 答案正确 | 3 ms | 296 KB |
1 | 答案错误 | 23 ms | 680 KB |
2 | 运行超时 | -- | 0 KB |
3 | 答案正确 | 3 ms | 228 KB |
4 | 答案正确 | 65 ms | 896 KB |
5 | 答案正确 | 19 ms | 680 KB |
不用map的代码(测试点1、3没过)
#include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn=10010;
struct User{
char number[10];
int time;
char statu[5];
int isok;
int total;
int longtime;
}stu[maxn];
int n;
bool cmp(User a,User b){
if(strcmp(a.number,b.number)!=0){
return strcmp(a.number,b.number)<0;
}else{
return a.time<b.time;
}
}
bool cmp1(User a,User b){
if(a.longtime!=b.longtime){
return a.longtime>b.longtime;
}else{
return strcmp(a.number,b.number)<0;
}
}
bool cmp2(User a,User b){
if(a.isok!=b.isok){
return a.isok>b.isok;
}else{
return a.time<b.time;
}
}
int main(){
int k;
scanf("%d%d",&n,&k);
int hhh=0,mmm=0,sss=0;
for(int i=0;i<n;i++){
scanf("%s%d:%d:%d%s",stu[i].number,&hhh,&mmm,&sss,stu[i].statu);
stu[i].isok=0;
stu[i].total=0;
stu[i].longtime=0;
stu[i].time=3600*hhh+60*mmm+sss;
}
sort(stu,stu+n,cmp);
int counts_ok=0;
for(int i=0;i<n;i++){
if(strcmp(stu[i].statu,"in")==0&&strcmp(stu[i+1].statu,"out")==0&&strcmp(stu[i].number,stu[i+1].number)==0){
stu[i].isok=1;
stu[i+1].isok=1;
counts_ok+=2;
stu[i].total=stu[i+1].time-stu[i].time;
i++;
}
}
int longt=0;
int f=0;
for(int i=0;i<n;i++){
if(stu[i].total!=0){
longt+=stu[i].total;
f=i;
i++;
while(strcmp(stu[i].number,stu[i+1].number)==0){
if(stu[i+1].total!=0){
longt+=stu[i+1].total;
}
i++;
}
if(strcmp(stu[i].number,stu[i+1].number)!=0){
stu[f].longtime=longt;
longt=0;
}
}
}
sort(stu,stu+n,cmp2);
int p=0,q=0;int count_in=0,count_out=0;
for(int i=0;i<k;i++){
int h=0,m=0,s=0;
scanf("%d:%d:%d",&h,&m,&s);
int time1=3600*h+60*m+s;
for(int j=p;j<n;j++){
if(strcmp(stu[j].statu,"in")==0&&stu[j].isok==1){
if(stu[j].time<=time1){
count_in++;
}else{
p=j;
break;
}
if(stu[j].isok==0){
break;
}
}
}
for(int j=q;j<n;j++){
if(strcmp(stu[j].statu,"out")==0&&stu[j].isok==1){
if(stu[j].time<=time1){
count_out++;
}else{
q=j;
break;
}
}
if(stu[j].isok==0){
break;
}
}
printf("%d\n",count_in-count_out);
}
counts_ok/=2;
sort(stu,stu+counts_ok,cmp1);
printf("%s ",stu[0].number);
for(int i=1;i<counts_ok;i++){
if(stu[i].longtime==stu[i-1].longtime){
printf("%s ",stu[i].number);
}else{
break;
}
}
printf("%02d:%02d:%02d\n",stu[0].longtime/3600,(stu[0].longtime/60)%60,stu[0].longtime%60);
return 0;
}
使用map的代码
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <string>
#include <map> //map头文件
using namespace std;
const int maxn=10010;
struct User{
char number[10];
int time;
char statu[5];
int total;
int longtime;
}stu[maxn],real[maxn];
map<string, int> partTime; //map中字符串得用string,并且前面要加#inlcude<string>
bool cmp(User a,User b){
if(strcmp(a.number,b.number)!=0){
return strcmp(a.number,b.number)<0;
}else{
return a.time<b.time;
}
}
bool cmp1(User a,User b){
return a.time<b.time;
}
int main(){
int k,n;
scanf("%d%d",&n,&k);
int hhh=0,mmm=0,sss=0;
for(int i=0;i<n;i++){
scanf("%s%d:%d:%d%s",stu[i].number,&hhh,&mmm,&sss,stu[i].statu);
stu[i].total=0;
stu[i].longtime=0;
stu[i].time=3600*hhh+60*mmm+sss;
}
sort(stu,stu+n,cmp);
int countsreal=0;
int maxtime=0;
for(int i=0;i<n;i++){
if(strcmp(stu[i].statu,"in")==0&&strcmp(stu[i+1].statu,"out")==0&&strcmp(stu[i].number,stu[i+1].number)==0){
real[countsreal]=stu[i];
real[countsreal].total=stu[i+1].time-stu[i].time;
if(partTime.count(stu[i].number)==0){ //如果map中没有键为number的数据,则将键number对应的值初始化为0
partTime[stu[i].number]=0;
}
partTime[real[countsreal].number]+=real[countsreal].total;
if(maxtime<partTime[real[countsreal].number]){
maxtime=partTime[real[countsreal].number]; //找到最长停留时长
}
countsreal++;
real[countsreal]=stu[i+1];
countsreal++;
i++;
}
}
sort(real,real+countsreal,cmp1);
int now=0,carnum=0;
for(int i=0;i<k;i++){
int h=0,m=0,s=0;
scanf("%d:%d:%d",&h,&m,&s);
int time1=3600*h+60*m+s;
while(real[now].time<=time1&&now<countsreal){
if(strcmp(real[now].statu,"in")==0){
carnum++;
}else{
carnum--;
}
now++;
}
printf("%d\n",carnum);
}
map<string,int>::iterator f; //map的迭代器定义
for(f=partTime.begin();f!=partTime.end();f++){
if(f->second == maxtime){
printf("%s ",f->first.c_str()); //用printf输出string时,需要先用c.str()将string转化为字符串数组再输出
}
}
printf("%02d:%02d:%02d\n",maxtime/3600,(maxtime/60)%60,maxtime%60);
return 0;
}