2019年广东工业大学腾讯杯新生程序设计竞赛(同步赛)D-城市的税金

链接:https://ac.nowcoder.com/acm/contest/3036/D
来源:牛客网
 

题目描述

影从者,并非真正的从者,而是一种’量产’从者,或是一种劣化从者。
而虚假的圣杯,准确说是残缺的圣杯,理所当然的只能召唤出影从者这种非正常使魔。但这也能称之为奇迹了,并不是凭依任何实体,而是自己创造出实体的魔术仪式。那家伙,也能称之为天才了吧。
虽然他想要完全掌控这虚假的圣杯,但是总有缺憾。
面对眼前这个从者(servant),我不知道该怎么办。他浑身上下都被不祥的黑雾包围着,连面貌都无法看清,很难说他到底还是不是保持清醒的状态。
「虽然能明显感觉到,你不是御主(master),但曾是吧」
「居然还保持着理智吗」我有些惊讶
「是啊,我才刚刚被圣杯召唤而来,但显然这圣杯很不对劲是吧」虽然无法看清他的表情,但我感觉到他是在苦笑「所以我也需要一个御主进行魔力供给」
「你是想让我和你签订契约么」
「不错,我相信你也是需要我的力量的吧」他似乎笑了「但是我也不能就这样简单的签订,如果你能回答我的问题,那么我就认可你吧」
「洗耳恭听」
「我曾是一名国王,也是一名十字军骑士。我征战过无数沙场,也攻克过无数的堡垒。这N座被我所征服的城市,要定期向我上贡一定的金额,但是计算税金的公式异常复杂和繁琐。而且随时都会有概率进行税金的修改。我会告诉你他们一开始所需要缴纳的税金,而且也会告诉你什么时候会对编号从L到R的城市进行税金修改,但当我向你提问的时候,你要回答我编号从L到R的城市当中,相同税金金额出现次数最多的出现次数」
「轻而易举,狮心王,理查一世」

输入描述:

第一行输入两个整数N,M (1<=N, M<=100),其中N表示理查一世所征服的城市个数,M表示理查一世对城市税金的修改次数和对税金的询问次数之和。

第二行输入N个整数pi (0<=pi<=109),表示N个城市最初所需缴纳的税金金额。
接下来M行,每行输入为以下两种中的其中一种:
1 L R, (1 <= L<=R <= N)表示对编号从L到R的城市进行税金修改, 其中修改公式为:p1=p0*251%996*404*123,(p0和p1分别代表修改前的税金和修改后的税金)。
2 L R, (1 <= L<=R <= N)表示此时理查一世需要知道编号从L到R的城市中,相同税金金额出现次数最多的金额的出现次数。  

输出描述:

对于输入格式为’2 L R’的询问单独输出一行进行回答

示例1

输入

6 5
1 2 3 4 5 3
1 1 6
2 1 6
1 3 5
1 2 4
2 2 4

输出

2
1

说明

注意运算过程中所有数不超过long long的范围。
第一次操作后,6个数分别为12472692 24945384 37418076 397536 12870228 37418076。
第二次操作后,输出2(出现次数最多的是37418076)。
第三次操作后,6个数分别为12472692 24945384 34585632 13118688 41144976 37418076。
第四次操作后,6个数分别为12472692 6559344 2981520 36970848 41144976 37418076。
第五次操作后,输出1


错误

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
    int N, M;
    scanf("%d %d", &N, &M);
    long long* p = (long long*)malloc(sizeof(long long) * N);
    for (int i = 0;i < N;i++)
	scanf("%lld", &p[i]);
    int S, L, R;
    for (int i = 0; i < M;i++) {
	scanf("%d %d %d", &S, &L, &R);
	if (S == 1)
	    for (int n = L - 1;n < R;n++)
		p[n] = p[n] * 251 % 996 * 404 * 123;
	if (S == 2) {
	    int* Map_B;
	    long long* Map_A;
	    Map_A = (long long*)malloc(sizeof(long long) * (R - L + 1));
	    Map_B = (int*)malloc(sizeof(int) * (R - L + 1));
	    memset(Map_A, 0, sizeof(long long) * (R - L + 1));
	    memset(Map_B, 0, sizeof(int) * (R - L + 1));
	    for (int n = L - 1;n < R;n++)
		for (int j = 0;j < R - L + 1;j++)
		    if (Map_A[j] == 0) {
			Map_A[j] = p[n];
			Map_B[j]++;
			break;
		    }
		    else
			if (Map_A[j] == p[n]) {
			    Map_B[j]++;
			    break;
			}
	    int max = 0;
	    for (int n = 0; n < (R - L + 1) && Map_B[n] != 0;n++) {
	        if (max <= Map_B[n])
		    max = Map_B[n];
	    }
	    printf("%d\n", max);
	}
    }
    return 0;
}

自己按照逻辑推导并没有发现错误,但是在测试过程中总是不是全对,总有几个是错误的

实在搞不清楚

改进

借鉴和了解了其他几篇文章:

https://blog.csdn.net/weixin_44668898/article/details/103444051

https://blog.csdn.net/xyb890826/article/details/39118197

https://blog.csdn.net/weixin_44668898/article/details/103444051

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define ll long long 
ll p[105], Map_A[105];
int cmp(const void* a, const void* b){
	return *(int*)b - *(int*)a;
}
int main() {
    int N, M;
    scanf("%d %d", &N, &M);
    for (int i = 1;i <= N;i++)
	scanf("%lld", &p[i]);
    int S, L, R;
    for (int i = 0; i < M;i++) {
	scanf("%d %d %d", &S, &L, &R);
            if (S == 1)
		for (int n = L;n <= R;n++)
        	    p[n] = p[n] * 251 % 996 * 404 * 123;
	    if (S == 2) {
		memset(Map_A, 0, sizeof(Map_A));
		int k = 1;
		for (int i = L;i <= R;i++)
	    	    Map_A[k++] = p[i];
		k--;
		qsort(Map_A + 1, k, sizeof(ll), cmp);
		ll sum = 1, ans = 0;
		for (int i = 2;i <= k;i++) {
		    if (Map_A[i] == Map_A[i - 1])	sum++;
		    else {
		        if (sum > ans)	ans = sum;
			sum = 1;
		    }
		}
		if (sum > ans)	ans = sum;
		printf("%d\n", ans);
	    }
    }
    return 0;
}

在这个化简的地方浪费了很多时间

p[n] *= 251 % 996 * 404 * 123;
≠
p[n] = p[n] * 251 % 996 * 404 * 123;
发布了13 篇原创文章 · 获赞 7 · 访问量 1013

猜你喜欢

转载自blog.csdn.net/weixin_45696526/article/details/105315194