hdu4585-题意:
对于每一个新队友,找到与他实力最接近的老队友(优先选实力低的),然后新队员加入成老队员
解析:
明显用二分处理,查找与他实力最近的两位
set,map都能自动排序,选择任意一种解决
1.map&set
ac:
#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
set<int> st;
set<int>::iterator it;
int main()
{
int n,x,j;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
st.clear();
st.insert(1000000000);
mp[1000000000]=1;
if(n==0)
break;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&j,&x);
mp[x]=j;
it=st.lower_bound(x);
if(it==st.end())
{
it--;
printf("%d %d\n",j,mp[*it]);
}
else{
int v=*it;
if(it!=st.begin())
{
it--;
int g=*it;//小的
if(abs(g-x)<=abs(v-x))
printf("%d %d\n",j,mp[g]);
else
printf("%d %d\n",j,mp[v]);
}
else
printf("%d %d\n",j,mp[*it]);
}
st.insert(x);
}
}
return 0;
}
map
ac:
#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
map<int,int>::iterator it;
int main()
{
int n,j,x;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
mp.clear();
mp[1000000000]=1;
for(int i=0;i<n;i++)
{
scanf("%d%d",&j,&x);
it=mp.upper_bound(x);
if(it==mp.end())
{
it--;
printf("%d %d\n",j,it->second);
}
else{
if(it==mp.begin())
printf("%d %d\n",j,it->second);
else{
int v=it->first;
it--;
int g=it->first;
if(abs(g-x)<=abs(v-x))
printf("%d %d\n",j,it->second);
else
printf("%d %d\n",j,(++it)->second);
}
}
mp[x]=j;
}
}
return 0;
}
hdu-6667:http://acm.hdu.edu.cn/showproblem.php?pid=6667
题意:
每个班有a[i]个人,产生b[i]杯咖啡
每个班的人只能吃别的班的咖啡
问有多少人能喝咖啡:
ac:
我用unordered_map遍历,喝完了就删掉
unordered_map删除的时候,要it++后,吧(it-1)删掉,不能直接删 it->first,如果直接删除,it->first指针溢出
ac:
#include<bits/stdc++.h>
#define lowbit(x) (x)&(-x)
#define IOS ios::sync_with_stdio(false);cin.tie(0);
#define pb push_back
#define ll long long
#define mod 1e9+7
#define MAXN 2000005
using namespace std;
typedef unsigned long long ull;
ll gcd(ll a,ll b) {while(b^=a^=b^=a%=b);return a;}
ll a[MAXN],b[MAXN];
unordered_map<int,int> hash1;
unordered_map<int,int>::iterator it,gt;
int main()
{
//IOS
//freopen("E:/in.txt","r",stdin);
//freopen("E:/out.txt","w",stdout);
int t,n;
scanf("%d",&t);
while(t--)
{
hash1.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
hash1[i]=b[i];
}
ll sum=0;
for(int i=1;i<=n;i++)
{
int k=a[i];
for(it=hash1.begin();it!=hash1.end();)
{
if(i==it->first)
{
}
else{
if(it->second<k)
{
k-=it->second;
sum+=it->second;
hash1[it->first]=0;
}
else{
hash1[it->first]=hash1[it->first]-k;
sum+=k;
break;
}
} //注意,不能直接删除gt->first
gt=it;
it++;
if(hash1[gt->first]==0)
hash1.erase(gt->first);
}
}
printf("%lld\n",sum);
}
return 0;
}