[学习笔记][算法]往届低程真题(缺)

题目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 标准输入输出流是同步的,这就意味着每次调用 cincout 时,它们会在内部刷新缓冲区。然而,这个同步可能导致性能损失,因为 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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值