参加的第一场正儿八经的ACM比赛,从头到尾连开五题最终除了1004签到之外全部凉凉。总结一下,在做题策略上还是不要过于长时间一个人生怼一道题,要注重团队合作的意识,除此之外,能力还是差很多,做题量远远不够,对模型的分析和转化能力待加强。
大概就说下开了的那五题吧
链接 1001 hdu6438 Buy and Resell
题目大意:商人能在N个地方以aiai的价格买入或卖出商品,在每个地方只能做一次交易。要求最大的收益,同时最小化交易次数。(这道题比赛剩二十分钟的时候队友才给我看,突然发现以前做过一道基本差不多的题,然而加入本题要求的天数后一直调试到比赛结束,可惜了)
明白题意后,很显然的想法贪心或着dp,但是发现每一天的状态不仅要受过去和未来两个方面的影响,dp有点不合适。所以采取贪心。因为有买和卖两种情况要考虑,所以我们考虑拆点,并假设一开始每天都是买的,用优先队列存两次,当一个数两次都被pop出去后,表示该价格买入。重点要考虑买入和卖出价格相同时,忽略他们的应对措施,即用该数的编号id区分,每个数出现的次数用map维护,详情见代码。
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
typedef long long ll;
using namespace std;
int n,x;
ll z;
struct Info
{
int val;
int id;
bool operator<(const Info &aa) const{
if(aa.val==val)return id<aa.id;
return val<aa.val;
}
}a[100010];
priority_queue<Info> q;
map<int,int> ma;
int v[100010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int cnt=0;
z=0;
scanf("%d",&n);
m