这一场让我意识到了STL的重要性。
没有库里布莱恩特,自己一个人的尝试,Gym三星场,只做出来4道题,哎,太菜了。今天下午的天梯赛大的也不咋滴,自己一个人在101补昨天的题。
题意:有一位工作人员想利用喝咖啡来休息,所以他给了我们一个数组a,表示他想喝咖啡的时间点(假设她喝咖啡的时间不计),但是呢,他要是频繁喝咖啡老板就不同意了,所以每次喝咖啡的间隔要大于d。问他要将数组中的时间点都经历一边至少要多少天。并把每个时间点是在第几天喝咖啡的输出。
简单来说,就是将这个数组分成n段,每段中每两个数之差大于d。求n的最小值。
这题我是用set做的,不过貌似也能用优先队列做。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 1000000010//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
int n,m,d;
int a[200010];
set<int> s;
map<int,int> mp;
int main()
{
cin>>n>>m>>d;
rep(i,1,n)
cin>>a[i];
rep(i,1,n)
s.insert(a[i]);
set<int>::iterator it;
int cnt=0;
int ans=1;
while(s.size())
{
it=s.lower_bound(cnt);
//在set中查找第一个大于等于cnt的数所在的位置,如果不存在,返回s.end()
if(it==s.end())
{
ans++;
cnt=0;
}
else
{
mp[*it]=ans;
s.erase(*it); //删除set中值为*it的数
cnt=*it+d+1;
}
}
cout<<ans<<endl;
rep(i,1,n)
cout<<mp[a[i]]<<" ";
return 0;
}
题意:给出n个细胞的大小,两个一样大的细胞可以合成一个两倍大小的,也可以增加任意大小任意个细胞,问至少需要多少个细胞可以将所有细胞合成一个,不能合成一个输出-1。
这个题对于我来说的意义就是让我联系一下STL。
AC代码:
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 1000000010//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
priority_queue<ll,vector<ll>, greater<ll> > q; //从小到大排列,先输出小的
//priority_queue<int> q; //从大到小排列,先输出大的
int main()
{
ll n;
cin>>n;
ll x;
rep(i,1,n)
{
scanf("%I64d",&x);
q.push(x);
}
ll ans=0;
while(q.size()>1)
{
ll a=q.top();
q.pop();
ll b=q.top();
q.pop();
if(a==b)
{
q.push(2*a);
}
else
{
if(2*a>b)
{cout<<"-1";return 0;}
else
{
q.push(b);
q.push(2*a);
ans++;
}
}
}
cout<<ans;
return 0;
}
再贴一个runtime error on test 24的,用set实现的,不知道哪错了......
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 1000000010//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
multiset <ll> s;
int main()
{
ll n;
cin>>n;
ll x;
rep(i,1,n)
{
scanf("%I64d",&x);
s.insert(x);
}
ll ans=0;
multiset <ll>::iterator it1;
multiset <ll>::iterator it2;
multiset <ll>::iterator it;
multiset <ll>::iterator itt;
while(1)
{
itt=s.end(); //返回set中最后一个元素的下一个位置
itt--; //迭代器不能加1减1,但是能自加自减
if(s.size()==0)
break;
if(*s.begin()==*itt&&s.count(*s.begin())==1)
break;
it2=s.begin();
it2++;
it1=s.begin();
if(*it1==*it2)
{
s.erase(it1); //删除迭代器所指位置的那一个元素,只删除一个
s.erase(it2);
s.insert(2*(*it1));
}
else
{
if(*it1*2>*it2)
{cout<<"-1";return 0;}
else
{
ans++;
s.insert(2*(*it1));
s.erase(it1);
}
}
if(*(s.begin())<0)
{cout<<"-1";return 0;}
}
cout<<ans;
return 0;
}