您的位置:首页 > 其它

hdu 1052 Tian Ji -- The Horse Racing(很好的贪心)

2012-05-07 22:26 381 查看
题目分析:

这题的题意就是求怎么让田忌赢最多,可以赢负的。

算法是先将两个都排序,然后按1、田忌的快马比齐王的快,直接比掉。2、若快马没有快,拿田忌最慢的和齐王最慢的比较,若快直接比掉。3、若慢马比齐王慢,就拿田忌最慢的和齐王最快的比较。

按这个算法就可以啦!不过有一组很好的测试数据。

4

1 2 4 5

2 3 3 4

注意:1.很好的贪心题

2. 哎,贪心都不会了,可悲呀,原来的思路彻底错了。。。。。

3.注意不要拘泥于一段,,,

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int a[1200],b[1200];
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
/*for(int i=1;i<=n;i++)
printf("%d  ",a[i]);
printf("\n");
for(int i=1;i<=n;i++)
printf("%d   ",b[i]);
printf("\n");*/

int h1,h2,t1,t2;
int w=0,l=0;
h1=1,h2=1,t1=n,t2=n;
for(int i=1;i<=n;i++)
{
if(a[h1]>b[h2])
{
w++;
h1++;
h2++;
}
/*else if(a[h1]==b[h2])
{

}*/
else
{
if(a[t1]>b[t2])//最慢的和最慢的比较
{
w++;
t1--;
t2--;
}
else//最慢的和最快的比较a[t1]与b[h2]比较
{
if(a[t1]==b[h2])
;
else
l++;
t1--;
h2++;
}
}
}
printf("%d\n",(w-l)*200);
}//
system("pause");
return 0;
}

/*我这种的思想是,先升序排列,用田最慢的马和齐王最慢的比较,如快 直接比掉;若慢,就和齐王最快的比掉
如相等,看下一对,,,
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
return x<y;
}
int main()
{
int a[1200],b[1200];
int  vis[1200];
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
/*for(int i=1;i<=n;i++)
printf("%d  ",a[i]);
printf("\n");
for(int i=1;i<=n;i++)
printf("%d   ",b[i]);
printf("\n");
memset(vis,0,sizeof(vis));
int win=0,l=0,tail=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(vis[j]==0)
{
if(a[i]>b[j])
{
win++;
vis[j]=1;
}
else
{
/*
if(a[i]<b[tail] && vis[tail]==0)//小于等于就让田输掉。。。是错的
{                               //5;1 2  2 4 5 ;2 2 3 3 4
l++;
}
vis[tail]=1;
tail--;
//break;放错位置了

if(a[i]==b[j] && i+1<=n && j+1<=tail && a[i+1]!=b[j+1])//这一局平了
{
vis[j]=1;
break;
}
if(a[i]<b[j]&&vis[tail]==0)//输掉
{
l++;
vis[tail]=1;
tail--;
}
}
break;
}
//printf("w=%d   l=%d\n",win,l);
int ans=(win-l)*200;
printf("%d\n",ans);
}
system("pause");
return 0;
}
*/
/*
3
15 12 9
16 13 9
********
5
7 8 9 12 15
7 8 9  13 16
***************
4
1 2 4 5
2 3 3 4
200这组数据很好....

*/

/*
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[1005],b[1005];
int i,n,sum,aa,ab,ba,bb;
while(cin>>n&&n)
{
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>b[i];
sort(a,a+n);
sort(b,b+n);
aa=0;ab=n-1;ba=0;bb=n-1;
sum=0;
for(i=0;i<n;i++)
{
if(a[ab]>b[bb]) {ab--;bb--;sum++;continue;}
if(a[aa]<b[ba]) {aa++;bb--;sum--;continue;}
if(a[aa]>b[ba]) {aa++;ba++;sum++;continue;}
if(a[aa]==b[ba])
{
if(a[aa]<b[bb])
sum--;
else
{
if(a[aa]>b[bb])
sum++;
}
aa++;bb--;
}
}
sum=sum*200;
cout<<sum<<endl;
}
return 0;
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: