NOIP2017普及组复赛题解

T1 score 题面:

(不想看的跳过吧)
这里写图片描述
无疑,这是一道可以媲美A+B Problem的大水题,刚开始看到,以为要用浮点数操作之类的,但是题目给出A,B,C全部小于等于100并且都为10的倍数,所以就使这道题变成了彻彻底底的水题。
题意大概如此:给出三个均为10的倍数并且小于等于100的整数A,B,C,以整数形式输出 A20%+B30%+C50%
显然
A20%=A20/100=A/5
B30%=B30/100=A3/10
C50%=C50/100=C/2
为什么要这样算呢,因为这样能够避免浮点数运算,粗心出错的概率也就小了很多,下面是代码:

#include <cstdio>

int a, b, c, ans;

int main()
{
    scanf("%d%d%d", &a, &b, &c);
    ans = a / 5 + b * 3 / 10 + c / 2;
    printf("%d\n", ans);
    return 0;
}

(真的需要给这题题解吗?)

T2 librarian 题面

(不想看的跳过吧)
这里写图片描述
这里写图片描述
刚开始看,以为是什么有套路的题目,实际上就是一道模拟。
题意:有一个n个元素的字典,元素都是整数,给出q个询问,每个询问有一个十进制下长度为a的整数b,求字典的n个元素中在十进制下,后a位与b相等的元素中,字典序最小的一个,如果没有则输出-1。(其实不如看题面)
思路:模拟
首先读入n个整数,没有必要以字符串形式读入,当然字符串也可以做。
那么对于每一个整数b(a其实是没有用的),我们设一个p[i],p[i]=1表示a[i]不以b结尾,即不符合要求;其余的p[i]=0就是符合条件的。那么剩下的工作就是把n个元素中满足p[i]=0的元素取一个最小值,问题就转化为了如何求p数组。具体步骤:将b与其它几个a[i]末尾对齐,此时b的最后一位为b mod 10,a[i]的最后一位为a[i] mod 10,显然在(b mod 10)和(a[i] mod 10)不相等时,p[i]=1,然后就把b和a[i]同时/10,移动到下一位比较,直到b为0为止。比较过程如下:
(题目数据中23的比较)
这里写图片描述
(题目数据中123的比较)
这里写图片描述
时间复杂度为O(nq),题目数据显然不会超时。
代码:

#include <cstdio>
#include <cstring>

const int N = 1007, INF = 666666666; //个人习惯,别在意哈
int n, q, a, b, ans = INF;
int num[N], t[N], p[N];

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值