题目A:ACM? 你也想打ACM?
问题一:输入字符数据的分类处理
解决方法:
1.使用cin流,用一个char类型的变量将分割符号流出,再读取。
//读取+分割数据
int no,hh,mm;
string res;
char gar;
cin>>no>>gar>>hh>>gar>>mm>>gar>>res;
2.格式化输入
scanf("%lld:%lld-%lld:%s", &id, &hh, &mm, msg)
问题二:超时问题
解决方法:
在竞赛编程等需要高效输入输出的场景下,关闭同步流和使用ios::sync_with_stdio(false)
是一个常见的优化手段,这样可以提高输入输出的速度。
1.使用ios::sync_with_stdio(false)
ios::sync_with_stdio(false);
2.关闭 C++ 的输入输出流与 C 标准输入输出流的同步。
cin.tie(0);
cout.tie(0);
默认情况下,C++ 的输入输出流与 C 标准输入输出流是同步的,这就意味着每次调用 cin
或 cout
时,它们会在内部刷新缓冲区。然而,这个同步可能导致性能损失,因为 C++ 的流库与 C 标准库之间的同步可能是相对昂贵的。
问题三:超出边界问题
因为24*60-1)*1.5e6=2158500000>2147483647 超出了int的范围,所以用long long代替int
#define int long long
问题四:数组越界
在设置数组时,将遍历的起始点i=0变为i=1后,没有考虑清楚数组的范围,导致数组越界不够大。
应该注意数组大小。
int error[n+1]; // 错误次数数组
bool pass[n+1]; // 题目是否通过
额外知识:
使用pair这个数据结构+它的函数make_pair()让函数变相返回出2个值。
set是集合。
流类型知识。
最终代码示例:
#include<iostream>
#include<string>
#include<sstream>
#define int long long
using namespace std;
pair<int,int> acmContest(int n,int k)
{
int error[n+1]; //错误次数数组
bool pass[n+1]; //题目是否通过
int totalTime=0,passSub=0; //结果
for(int i=1;i<=n;i++) // 将初始次数初始化为0
{
error[i]=0;
pass[i]=false;
}
for(int i=0;i<k;i++)
{
//读取+分割数据
int no,hh,mm;
string res;
char gar;
cin>>no>>gar>>hh>>gar>>mm>>gar>>res;
//处理数据
if(res=="accepted" && !pass[no])
{
totalTime+=hh*60+mm+20*error[no];
passSub++;
pass[no]=true;
}
else
{
error[no]++;
}
}
return make_pair(passSub,totalTime);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,k;
cin>>n>>k;
pair<int,int> res = acmContest(n,k); //处理提交的数据
cout<<res.first<<" "<<res.second;
}