一道acm的水题帮我看下哪里错了
http://acm.nbut.cn/Problem/view.xhtml?id=1100原题在这里我的代码#include<stdio.h>#include<stdli...
http://acm.nbut.cn/Problem/view.xhtml?id=1100原题在这里
我的代码
#include<stdio.h>
#include<stdlib.h>
struct table
{
int begin;
int end;
}data[210];
int cmp( const void *a , const void *b)
{
struct table *c = (struct table *)a;
struct table *d = (struct table *)b;
return c->end-d->end;
}
int a[210];
int main()
{
int i,j,t,x,k,n,count;
while(~scanf("%d",&n))
{
x=0;
for(i=0;i<n;i++)
{
count=1;
scanf("%d",&t);
for(j=0;j<t;j++)
{
scanf("%d %d",&data[j].begin,&data[j].end);
}
qsort(data,t,sizeof(data[0]),cmp);
for(k=1;k<t;k++)
{
if(data[k].begin>data[k-1].end)
{
continue;
}
else
count++;
}
a[x++]=count*10;
}
for(i=0;i<x;i++)
{
printf("%d\n",a[i]);
}
}
}
我的思路就是将 每一组桌子的end进行升序排列,然后将第一组开始的begin与它后面的end进行大小比较, 是不是我想的太简单了? 展开
我的代码
#include<stdio.h>
#include<stdlib.h>
struct table
{
int begin;
int end;
}data[210];
int cmp( const void *a , const void *b)
{
struct table *c = (struct table *)a;
struct table *d = (struct table *)b;
return c->end-d->end;
}
int a[210];
int main()
{
int i,j,t,x,k,n,count;
while(~scanf("%d",&n))
{
x=0;
for(i=0;i<n;i++)
{
count=1;
scanf("%d",&t);
for(j=0;j<t;j++)
{
scanf("%d %d",&data[j].begin,&data[j].end);
}
qsort(data,t,sizeof(data[0]),cmp);
for(k=1;k<t;k++)
{
if(data[k].begin>data[k-1].end)
{
continue;
}
else
count++;
}
a[x++]=count*10;
}
for(i=0;i<x;i++)
{
printf("%d\n",a[i]);
}
}
}
我的思路就是将 每一组桌子的end进行升序排列,然后将第一组开始的begin与它后面的end进行大小比较, 是不是我想的太简单了? 展开
2个回答
展开全部
想法的确太简单。这道题目只扫一遍是出不来的。
细节:奇偶没有考虑、没考虑begin比end大的情况。
下面看看我的ac代码吧,思想是模拟过程,一遍遍扫,把能在一回合内同时搬运的桌子都全部搬掉,直到全部搬完。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
struct Node
{
int s,t;
bool used;
bool operator<(const Node& rhs) const
{
return s<rhs.s; //按begin排序
}
}a[210];
int n;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].s,&a[i].t);
a[i].used=false;
if(a[i].s>a[i].t) swap(a[i].s,a[i].t); //当begin>end,交换
if(a[i].s%2==0) a[i].s--; //处理奇偶情况,将偶数全变为奇数,防止重叠
if(a[i].t%2==0) a[i].t--;
}
sort(a,a+n);
int ans=0; //答案
int cnt=0; //已经移动的桌子数
while(cnt<n) //一遍一遍的扫,将一遍之内可以同时搬运的used全部置为true
{
int tmp=0;
for(int i=0;i<n;i++)
{
if(!a[i].used && a[i].s>tmp)
{
a[i].used=true;
tmp=a[i].t;
cnt++;
}
}
ans++; //统计扫了几遍
}
printf("%d\n",ans*10);
}
return 0;
}
追问
恩 我也做出来了 主要忘记 1和2 对应的是同一个过道 谢谢!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询