本文将主要围绕有关map的今典应用展开:
下面我用图进行分析:
下面为AC代码:
#includeusing namespace std; struct Point { int x,y; bool operator < (const Point & r) const { return x < r.x || ( x == r.x && y < r.y );//升序排列 } }; multiset S; int main() { int T, kas = 0; scanf("%d",&T); while(T--){ if(kas) puts(""); int n; scanf("%d",&n); printf("Case #%d:\n",++kas); S.clear(); while(n--){ Point P; scanf("%d%d",&P.x,&P.y); auto it = S.lower_bound(P); if(it == S.begin() || (--it)->y > P.y){ it = S.insert(P); while(it != S.end() && (it->x==P.x&&it->y==P.y)) it++; while(it != S.end() && it->y >= P.y) S.erase(it++); } printf("%d\n",S.size()); } } return 0; }
接题:
其实与上一章的task题类似,我们按敌方防御力从大到小,选择攻击力合适的,在其中,如果他们防御力均小于,我们选一个防御力min的去同归于尽,反之选一个最接近敌方攻击力的。
下面是AC代码:
#includeusing namespace std; struct node{ int att,de; }t[100010],e[100010]; int T,n,m,k; bool cmp(node a,node b){ return a.att>b.att; } bool cmp1(node a,node b){ return a.de>b.de; } int main(){ cin>>T; while(T--){ if(k!=0) puts(" "); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&t[i].att,&t[i].de); for(int i=1;i<=m;i++) scanf("%d%d",&e[i].att,&e[i].de); sort(t+1,t+n+1,cmp); sort(e+1,e+m+1,cmp1); int j=1,cnt=0,f=0; map mp; for(int i=1;i<=m;i++){ while(t[j].att>=e[i].de){ if(mp.count(t[j].de)==0) mp[t[j].de]=1; else mp[t[j].de]++; j++; } if(mp.empty()){ f=1; break; } map ::iterator it=mp.lower_bound(e[i].att); if(it==mp.end()||(--mp.end())->first<=e[i].att){ cnt++; if(--mp[mp.begin()->first]==0) mp.erase(mp.begin()->first); } else{ if(it->first==e[i].att){ if(--mp[(++it)->first]==0) mp.erase(it->first); } else{ if(--mp[(it)->first]==0) mp.erase(it->first); } } } if(f==0) printf("Case #%d: %d",++k,n-cnt); else printf("Case #%d: -1",++k); } }
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章