noip2013题解 普及组

这篇博客回顾了noip2013竞赛中的一些题目,包括计数问题、表达式求值和小朋友的数字等。作者分享了自己的解题思路,如使用贪心算法和拓扑排序,并提到了在处理大数据时需要注意的问题,如内存溢出和数据类型的选择。尽管部分题目未能AC,但作者深入分析了失败原因并提供了可能的解决方案。
摘要由CSDN通过智能技术生成

这次整体题目个人认为不是非常难,但是想取得高分并不容易。

接下来是我的个人分析(包含ak代码)

1.计数问题

首先,第一眼看到这个题目我就惊呆了。因为做过。看了看数据范围,比较小,每个数字最多6位,1000000个,6000000次秒过是没有太大的问题的。

只要将每一个数字分离即可。

 

#include<stdio.h>
#include<iostream>
using namespace std;
const int MAX_P = 10;
int ans = 0;
int n,x;
void init()
{
	scanf("%d %d",&n,&x); //读入 
}
void makenx(int t)
{
	while (t)
	{
		if (t%10==x) ans++; //如果这个位置上的数字恰好为x ans方案数+1 
		t/=10;
	}
}
void work()
{
	int i;
	for (i=1;i<=n;i++)
	makenx(i); //从1~n 
}
void put()
{
	printf("%d",ans);
}
int main()
{
	freopen("count.in","r",stdin);
	freopen("count.out","w",stdout);
	init();
	work();
	put();
	return 0;
}


2.表达式求值

看到题目,我又惊呆了。还是做过。

可以用栈,但是我平常不习惯,而且用得不熟,毕竟是考试,就怕溢出。

首先我们将问题分解,就是先把所有的乘法算出,再算加法。每次mod1k

考虑特殊情况

1.第一个数字前没有符号

2.加好后面的数字没有符号

3.数字总长度不能开10w数组

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int MAX_N = 5000000;
const int INF = 10000;
char s[MAX_N];
int ans = 0;
int length;
void init()
{
	gets(s); //读取字符串 
	length=strlen(s); //测长度 
}
void work()
{
	int i,j,k,tmp,ctmp; //tmp表示当前数字 ctmp表示乘法当中的数字 
	i=0;
	while (i<length)
	{
		ctmp = 0;
		tmp = 0; //初始化 
		j=i;
		while (j<length&&s[j]>='0'&&s[j]<='9') //如果没有扫描完 并且是数字 
		{
			tmp=tmp*10+(s[j]-'0'); //*10+ 把字符串还原为数字 
			j++;
		}
		tmp%=INF; //mod 1k 
		ctmp=tmp; /
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值