cf800~900的各种坑

小坑

链接: link.

有时会在求和时习惯的将 sum 定义为 int 数据类型,那么如果来 n个(10^5)int 数据类型的求和呢,这显然会爆 int ,看题时若需要数据很大的话就用 long long

链接: link.
连续输入数字,肯定是字符串,数组输入会有空格(不连续) ,所以对于 字符串 + 数字 类型的计算题,都需要考虑 ASCII码 进行计算
还有 5009 = 5pow(10,3) + 0pow(10,2) + 0pow(10,1) + 9pow(10,0); 注意pow()函数逗号左边是底数,右边是指数

思维

链接: link.
这题我想多说几句,虽然是800的题,但我哇了好几次,求n个数中最小的不重复的数字,有就打印该数字的初始下标,没有就打印“-1”
刚做时我想到开一个二维数组,一个放数字,一个放对应的下标,考虑到冒泡排序 O(n^2) 肯定不行,用快排,快排只能对一维的排序,干脆不用排序,时间变空间,开两个大数组,一个放元素出现的次数,一个放初始下标,那么找到的第一个出现次数为一的元素的初始下标就是答案,找不到就“-1”,其实可以用map来做,不过这里用了map的思想
有个十分的坑,需要仔细读题,看这句话

It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).
原文
Input
The first line of the input contains one integer t (1≤t≤2⋅104) — the number of test cases. Then t test cases follow.

The first line of the test case contains one integer n (1≤n≤2⋅105) — the number of participants. The second line of the test case contains n integers a1,a2,…,an (1≤ai≤n), where ai is the i-th participant chosen number.

It is guaranteed that the sum of n does not exceed 2⋅105 (∑n≤2⋅105).

给数组初始化的时候我们习惯
memset(a,0,sizeof(a)) 函数,但这里注意一点,虽然首次开的数组有 210^5 ,但每次用都不超过这个长度,若每次都是进行 210^5 初始化,有 t 个样例就是 2*10^9 级别,显然只须对两个数组初始化n次就行了,大大缩短了时间
如下

	int n,t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		int tmp,pos,a[N],a2[N];
		bool ok=false;
		for(int i=0;i<=n;i++) 
		{
			a[i]=0;
			a2[i]=0;
				
		}
		for(int i=1;i<=n;i++) 
		{
			scanf("%d",&tmp);
			a[tmp]++;
			a2[tmp]=i;
				
		}
		for(int i=1;i<=n;i++)
		{
			if(a[i]==1){
				ok=true;
				pos=i;
				break;
			}
		}
		if(ok) {
			printf("%d\n",a2[pos]);
		}
		else printf("-1\n");
	}

27号cf800~900

链接: link.

这题给的x虽然是 大于等于1,小于等于50,但是考虑x最大时(即1~9的全排列)(1+2+3+……+9=45)所以当x大于45时,就必有重复的数字,就不满足题意,剩下的第一次当x有9则输出9,第二次有8则输出8,依次…… x逐渐变小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值