看到楼下好多神奇的算法,觉得我这个简简单单的方法也挺好的。
我是什么算法?
说白了就是:
暴搜!
但是,纯暴搜是肯定要超时的,所以我们要加一个小小的优化:
规则是这样的:
设a为科技创新奖,b为特殊贡献奖。
如果a[i]>b[j],那么a[i+1]也必定大于b[j](我用的是升序排序),之后同理。
所以,出现这种情况时,j可以毫不犹豫地向后加,一直加到b[j]不小于a[i]为止。
然后判断一不一样就可以了。
这就是一个很简单,却很实用的优化,可以AC。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include <cstdio> #include <algorithm> using namespace std; int n,m,b[100005]; struct Node{ int s,id; }a[100005];
inline bool cmp1(Node a,Node b){return a.s<b.s;} inline bool cmp2(Node a,Node b){return a.id<b.id;} int main(){ scanf ("%d%d",&n,&m); for (int i=0;i<n;i++)scanf ("%d",&a[i].s),a[i].id=i; for (int i=0;i<m;i++)scanf ("%d",&b[i]); sort (a,a+n,cmp1); sort (b,b+m); int i=0,j=0; for (;i<n;i++){ while (b[j]<a[i].s&&j<m)j++; if (b[j]!=a[i].s)a[i].s=0; } sort (a,a+n,cmp2); for (i=0;i<n;i++)if (a[i].s)printf ("%d ",a[i].s); return 0; }
|