A题:Couple doubi
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4861
这题逗逼了,刚開始根本就没什么思路,刚開始看题的时候有点像费马小定理,可是这个定理我仅仅知道。然后没用过。
看了下定义,有点不一样的是反着的。然后反着的我又不会转化。尼玛,就这样错过了最好的解题方法。然后队友又理解错题意了。
WA了多发,然后我又一次看了下题意。然后队友才发觉理解错题意了。然后找了规律才A。
代码比較短,就不贴了,真的写吧。
if(k/(p-1)&1) puts("YES");
else puts("NO");
D题: Task
链接:http://acm.hdu.edu.cn/showproblem.php?
pid=4864
这题刚開始想的时候想对了。
就是把机器和任务放到同一个数组里,然后依据时间和等级从大到小排序。可是时间知道怎么取。可是等级的时候就不太知道了。所以不太敢敲。也不知道怎么处理那些时间都大,然后等级也大的时候取哪个。
然后……然后刚刚知道怎么处理,可是又T了。看了琦神的,用multiset处理真是太机智了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<bitset>
#define INF 100007
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct abc
{
int ti,le,ty;
}a[200005];
bool cmp(abc a,abc b)
{
if(a.ti!=b.ti) return a.ti>b.ti;
if(a.le!=b.le) return a.le>b.le;
return a.ty>b.ty;
}
multiset<int>s;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int i,j,cnt=0;
ll sum=0,sum1=0;
s.clear();
for(i=0;i<n;i++)
scanf("%d%d",&a[cnt].ti,&a[cnt].le),
a[cnt++].ty=1;
for(i=0;i<m;i++)
scanf("%d%d",&a[cnt].ti,&a[cnt].le),
a[cnt++].ty=0;
sort(a,a+cnt,cmp);
for(i=0;i<cnt;i++)
{
if(a[i].ty) s.insert(a[i].le);
else
{
multiset<int>::iterator it=s.lower_bound(a[i].le);
if(it!=s.end())
sum1++,sum+=500*a[i].ti+2*a[i].le,s.erase(it);
}
}
printf("%I64d %I64d\n",sum1,sum);
}
return 0;
}