链接: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%,求大佬解答,可能是我的设计错误,可我一直没看出来,本来想发提问的,