讨论 / 谁帮我看看错呀(客栈问题)求大牛!!!!
john庹 2013-08-23 04:05:00
点我顶贴 收藏 删除
#include<iostream>

using namespace std;

int main()

{

int a=0,b=0,d=0,e=0,p=0,sum=0;

cin>>a>>b>>p;

int x[a][2];

for(d=0;d<a;d++)

{

cin>>x[d][0]>>x[d][1];

}

for(d=0;d<a;d++)

{

for(e=d+1;e<a;e++)

{

if(x[d][0]==x[e][0])

{

if((x[d][1]<=p)||(x[e][1]<=p))

{

sum=sum+1;

}

}

}

}

cout<<sum;

return 0;

}

#1 107229HR@2013-08-22 22:38:00
回复 删除
蒟蒻转一圈

同学你是超时了把。。。。。

另外你没统计中间价格?

#2 john庹@2013-08-23 03:18:00
回复 删除
回复 沙发107229HR 的帖子

能不能给个正解?跪求!!!!!!!

#3 107229HR@2013-08-23 04:05:00
回复 删除
回复 板凳john庹 的帖子

思路1:(不想看可跳过)

假设sum[i]代表从第0个到第-1i个一共有多少个最低消费<=p的酒店

每次假设两个客栈(i和j)颜色相同,计算sum[j]-sum[i]就能算出中间有几个位置用来小聚

时间复杂度 O(N*N)

空间复杂度 O(N)

得分 50

思路2:思路1的优化(不想看可跳过)

我们知道有K种色调,每一种色调挂一个链表

if 不懂什么叫链表

{

写思路1去。。。这题别想着AC了。。。

return 0;

}

每一个链表维护一个值,表示当前从这种颜色的第0,1,2,....t(当前已经有t个这种颜色的客栈了)个到第t+1个中可满足条件的酒店个数,设为x[i](i是颜色)

当每次见到一个颜色为i的,先把答案加上x[i],再进行以下2种操作之一

x[i] = x[i] (c[t+1]-c[t] = 0)

x[i] = t+1 (c[t+1]-c[t] > 0)

最后求出总方案数即可

求给分~

代码:(不想看可跳过)(写的很渣)

#include<set>

#include<map>

#include<list>

#include<queue>

#include<stack>

#include<vector>

#include<memory>

#include<string>

#include<math.h>

#include<time.h>

#include<utility>

#include<fstream>

#include<stdio.h>

#include<iostream>

#include<stdlib.h>

#include<algorithm>

using namespace std;

vector<int> a[200005];

int b[200005];

vector<int>::iterator pl;

vector<int>::iterator pr;

long long sum=0;

int main()

{

int i;

int n,k,p,x,m;

scanf("%d%d%d",&n,&k,&p);

b[0]=0;

for (i=1;i<=n;i++)

{

scanf("%d%d",&x,&m);

a[x].push_back(i);

if (m<=p) b[i]=b[i-1]+1; else b[i]=b[i-1];

}

int kk;

for (i=0;i<k;i++)

{

kk=0;

if (a[i].begin()==a[i].end()) continue;

pr=a[i].begin();

pr++;

for (pl=a[i].begin();pr!=a[i].end();pl++)

{

if (pl==pr) {pr++;sum+=kk;}

if (pr==a[i].end()) break;

for (;(pr!=a[i].end())&&(b[*pr]==b[*pl-1]);pr++) sum+=kk;

if (pr==a[i].end()) break;

kk++;

}

}

printf("%d",sum);

return 0;

}

查看更多回复
提交回复