此题链接单击这里
=================
这题重写了好几次都是超时,最后用二分法AC。
把超时代码附上
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int n, k = 0, i;
int sum = 1;
scanf("%d", &n);
int a[100001];
while (n--)
{
int m;
scanf("%d", &m);
for (i = k + 1; i <= k + m; i++)
a[i] = sum;
sum++;
k += m;
}
int m;
scanf("%d", &m);
for (int i = 0; i <m; i++)
{
scanf("%d", &n);
cout << a[n] << endl;
}
return 0;
}
AC代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
int find(int a[],int m,int k)
{
int i=1;
int j=k;
while(i<=j)
{
int mid=(i+j)/2;
if(a[mid]==m)
return mid;
else if(a[mid]>m)
j=mid-1;
else
i=mid+1;
}
return i;
}
int main()
{
int n,a[100001];
int k=1,sum=0;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
a[k++]=sum+m;
sum+=m;
}
scanf("%d",&n);
while(n--)
{
int q,m;
scanf("%d",&m);
q=find(a,m,k-1);
printf("%d\n",q);
}
}
有问题联系企鹅791267032
邮箱地址….wutanrong@Hotmail.com