(不想看的跳过吧)
无疑,这是一道可以媲美A+B Problem的大水题,刚开始看到,以为要用浮点数操作之类的,但是题目给出A,B,C全部小于等于100并且都为10的倍数,所以就使这道题变成了彻彻底底的水题。
题意大概如此:给出三个均为10的倍数并且小于等于100的整数A,B,C,以整数形式输出 A∗20%+B∗30%+C∗50% 。
显然
A∗20%=A∗20/100=A/5
B∗30%=B∗30/100=A∗3/10
C∗50%=C∗50/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;
}
(真的需要给这题题解吗?)
(不想看的跳过吧)
刚开始看,以为是什么有套路的题目,实际上就是一道模拟。
题意:有一个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];
因篇幅问题不能全部显示,请点此查看更多更全内容