链接:https://ac.nowcoder.com/acm/contest/8564/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
设计思路,就是贪心;
我只要把战斗机攻击和价值点排序,再来比较,攻击升序,d和value 按value 降序,然后攻击数组从尾部i=n-1开始来和数据结构数组的防御力j=0:和d进行比较,只要一旦比d大的出现,那个value可能是它的最大贡献点,j也不需要重置0,因为前面的是d都比攻击前一个的攻击力大,所以后面的攻击力a[i]继续往后比较,复杂度为O(n);
#include<iostream>
#include<algorithm>
using namespace std;
struct data{
int d;
int value;
};
bool cmp(data a, data b){
return a.value>b.value;
}
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
struct data dept[m],temp;
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
scanf("%d",&dept[i].d);
}
for(i=0;i<m;i++)
{
scanf("%d",&dept[i].value);
}
int sum =0;
sort(a,a+n);
sort(dept,dept+m,cmp);
for(i=n-1;i>=0;i--)
{
//j=0;
while(j<m&&a[i] <= dept[j].d)
j++;
if(j<m)
{
sum+=dept[j].value;
}
}
printf("%d\n",sum);
return 0;
}加上j=0;应该是超时问题,通过60%,但是我的设计是不需要O(n*m)的复杂度,只需要O(n)即可,可是通过率只有10%,求大佬解答,可能是我的设计错误,可我一直没看出来,本来想发提问的,



京公网安备 11010502036488号