您的位置:首页 > 大数据 > 人工智能

Codeforces Round #377 (Div. 2) E. Sockets(map,pair,STL)

2016-10-22 12:26 274 查看
这道题做法很简单,但是要用到stl的知识,这题主要是学到了pair 的排序,map里面怎么用pair,以及auto 的用法 ~

auto真的好方便~

要用迭代器遍历set 的时候还可以这么写:

<span style="font-size:18px;">set<int> temp;
for(auto it = temp.begin();it != temp.end();it++) {
.......
} //it 为迭代器类型</span>
自动转化为右边的形式。
两个pair类型的数据比较大小是先按左边的排序,再按右边的排序;

#include<bits/stdc++.h>
using namespace std;

const int inf = 0x3f3f3f3f;
const int maxn = 2e5+5;
typedef pair<int,int> pii;
set<pii> pc; //定义pair类型的set
int output[maxn],sum[maxn],soc[maxn],vis[maxn];

int main() {
int n,m,flag,x,cc;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++) {
scanf("%d",&x);
pc.insert(pii(x,i)); //插入
}
for(int i = 1;i <= m;i++)
scanf("%d",&soc[i]);
memset(vis,0,sizeof(vis));
memset(output,0,sizeof(output));
memset(sum,0,sizeof(sum));
flag = 1;cc = 0;
int ans1 = 0,ans2 = 0;
while(flag) {
flag = 0;
for(int i = 1;i <= m;i++) {
if(vis[i]) continue;
auto it = pc.lower_bound(pii(soc[i],-1)); //用auto写迭代器,用lower_bound来查找
if(it->first == soc[i] && it != pc.end()) {
output[it->second] = i;
vis[i] = 1;
ans1 += cc;ans2++;
sum[i] = cc;
pc.erase(it);
}
if(soc[i] > 1) soc[i]++; //(1+1)/2 = 1,所以1的时候就不加1,最小值为1的时候这样不会死循环
soc[i] /= 2;
if(soc[i] > 0) flag = 1;
}
cc++;
}
printf("%d %d\n",ans2,ans1);
for(int i = 1;i <= m;i++)
printf("%d%c",sum[i],i == m ? '\n' : ' ');
for(int j = 1;j <= n;j++)
printf("%d%c",output[j],j == n ? '\n' : ' ');
}



加油!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息