小坑
链接: 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逐渐变小