这次整体题目个人认为不是非常难,但是想取得高分并不容易。
接下来是我的个人分析(包含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; /