第一题,应评论区要求,贴一下;特别是那个多线程的,现在这方面水平不高,求喷求指正 //普通版(大量查询会超时,过了82%) #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin>>n; vector<int> everysum(n,0); for(int i=0;i<n;++i){ cin>>everysum[i]; } for(int i=1;i<n;++i){ everysum[i]+=everysum[i-1]; } int Q; cin>>Q; vector<int> Query(Q); for(int i=0;i<Q;++i){ cin>>Query[i]; } for(int i=0;i<Q;++i){ int result; vector<int>::iterator it; it=lower_bound(everysum.begin(),everysum.end(),Query[i]); if(it==everysum.end()) result=n; else result=(int)(it-everysum.begin()+1); cout<<result<<endl; } return 0; } //多线程版(可能有错,以前没怎么写过,这个还没测试,欢迎指正) #include <iostream> #include <vector> #include <algorithm> #include <thread> using namespace std; void thread_task(vector<int>& everysum,vector<int>& Query,vector<int>& group,int start,int end,int n){ for(int i=start;i<end;++start){ vector<int>::iterator it; it=lower_bound(everysum.begin(),everysum.end(),Query[start]); if(it==everysum.end()) group[start]=n; else group[start]=(int)(it-everysum.begin()+1); } } int main() { int n; cin>>n; vector<int> everysum(n); cin>>everysum[0]; for(int i=1;i<n;++i){ int tmp; cin>>tmp; everysum[i]=everysum[i-1]+tmp; } int Q; cin>>Q; vector<int> Query(Q); for(int i=0;i<Q;++i){ cin>>Query[i]; } if(Q>1000){//大于1000就开多线程 vector<int> group(Q); int numOfThread=Q/1000; for(int i=0;i<numOfThread;++i){ int start=i*1000; int end=start+1000; thread t(thread_task(everysum,Query,group,start,end,n)); t.join(); } thread t(thread_task(everysum,Query,group,numOfThread*1000+1,Q,n)); t.join(); for(int val:group){ cout<<val<<endl; } } else{//小于1000就没必要开线程了 for(int i=0;i<Q;++i){ int result; vector<int>::iterator it; it=lower_bound(everysum.begin(),everysum.end(),Query[i]); if(it==everysum.end()) result=n; else result=(int)(it-everysum.begin()+1); cout<<result<<endl; } } return 0; }
点赞 2

相关推荐

韵不凡:软件开发的工作需要博士吗?
点赞 评论 收藏
分享
牛客网
牛客企业服务