HDU4585
题意:
给n个僧人,每个僧侣有id和战斗力,僧侣的id都是按升序输入的。输出每个僧侣来的时候,他和哪个僧侣战斗。战斗的原则:在已经来到的僧侣中选一个战斗力跟他相近的僧侣进行战斗,我们要关注的就这个老僧侣的id,如果出现两个与他战斗力差值相同的情况下,我们输出id小的那个。
思路:在输入的时候进行处理,新数据要进去数组的话,就需要和老数据进行对比,我们先把新数据在已有的数据中进行遍历查找,找到某个位置x满足
x-1的战斗力<=x的战斗力<=x+1的战斗力
cin>>id>>val;
map<int,int>::iterator it;
it=m.lower_bound(val);
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e5+10;
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
map<int,int>m;
m[1e9]=1;
int id,val,tmp;
for(int i=1;i<=n;i++)
{
cin>>id>>val;
map<int,int>::iterator it;
/*for(it =m.begin();it!=m.end();it++)
{
if((it->first)>=val)
{
tmp=(it->first)-val;
break;
}
}*/
it=m.lower_bound(val);
cout<<id<<" ";
if(it==m.begin())
{
cout<<it->second<<endl;
}
else if(it==m.end())
{
it--;
cout<<it->second<<endl;
}
else
{
tmp=(it->first)-val;
it--;
int tmp2=(it->first)-val;
if(abs(tmp2)<=tmp)
{
cout<<it->second<<endl;
}
else
{
it++;
cout<<it->second<<endl;
}
}
m[val]=id;
}
}
return 0;
}
CF988C
题意:
给你k个数列(2<=k<=2*10^5),每个数列长度是n(n<=2*10^5),所有序列的总长度小于等于2*10^5,问是否有两个序列去掉序列其中一个值后两个序列序列和相等
思路:
用一个map存下每个序列去掉其中一个值后的剩余值及其的位置
map<int,pair<int,int>> m;
然后遍历每个序列,看有没有一个序列去掉一个值后的剩余值被map记录,若有则输出这个值的位置及遍历到的值的位置,没有输出NO
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxx=1e6+10;
map<int,pair<int,int>> m;
int a[maxx];
int main()
{
int t,n;
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>n;
int sum=0;
for(int j=1;j<=n;j++)
{
cin>>a[j];
sum+=a[j];
}
for(int j=1;j<=n;j++)
{
if(m.count(sum-a[j]))
{
cout<<"YES"<<endl;
cout<<m[sum-a[j]].first<<" "<<m[sum-a[j]].second<<endl;
cout<<i<<" "<<j<<endl;
return 0;
}
}
for(int j=1;j<=n;j++)
{
m[sum-a[j]]={i,j};
}
}
cout<<"NO"<<endl;
return 0;
}