您的位置:首页 > 其它

HD1052

2013-11-05 22:09 363 查看
这题的确是有点坑爹,第一次贪心的数据这么恶心,情况也多,这题只要你坚持几点就可以了。

(1)要将田忌的每一匹马发挥最大的功效,对于最快的马,将之于齐威王的马比较,如果快的话,就将两者比较,赢200,否者的话转向(2)

(2)将田忌的最慢的马与齐威王的最慢的马比较,如果快的话,就将两者比较,赢200.如果慢的话也比较只是这时候要输掉200,这时候使用这只(田忌的马)最慢的和齐威王最快的马比较,这就是他的最大的功效——当炮灰,否者(也就是速度相等)转向(3)

(3)将田忌的最慢的马与齐威王的快马比较如果慢的话就输掉200,如果想等的话(有些人会将这一步考虑掉),还是要计较只是这时候不赢不输。

(4)最后一个最重要的原则就是能够不要平局就不要平局,除非万不得已,不然就不要平局。

居于上面四个原则就可以做出来了。下面分别附上从慢马和快马比较的代码:

从快马开始比较:

#include<iostream>

using namespace std;

#include<cstdlib>

int cmp(const void *a,const void *b)

{

return *(int*)b-*(int*)a; //这里是快排他的时间复杂度是(nlogn)

}

int main()

{

int a[1005],b[1005];

int n,i,j,k,t,sum;

while(cin>>n,n)

{

sum=0;

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

cin>>a[i];

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

cin>>b[i];

qsort(a,n,sizeof(a[0]),cmp);//这是快排的两个函数,他们在于头文件#include<stdlib.h>或者#include<cstdlib>中

qsort(b,n,sizeof(b[0]),cmp);

i=j=0; 这里是快马

k=t=n-1; //这里是慢马

while((i<=k))

{

if(a[i]>b[j]) //快马比较,田忌快马胜,就赢200,

{

sum++;

i++;

j++;

}

else if(a[k]>b[t]) //否则田忌快马输,慢马比较,快就赢200

{

sum++;

k--;

t--;

}

else if(a[k]<b[t]) //否则[b],则用田忌最慢的马赛王最快的马


{

sum--;

k--;

j++;

}

else if(a[k]==b[t]) //如果慢马速度相等,拒绝平局,

{

if(a[k]<b[j]) //如果慢马比快马慢,就输掉200,很多人在这里不比较就直接输掉200;

{

k--;

sum--;

j++;

}

else if(a[k]==b[j]) //否则就是相等,不输不赢

{

k--;

j++;

sum+=0;

}

}

}

cout<<sum*200<<endl;

}

return 0;

}

[/b]

这是从慢马开始比较,原理都差不多,下面是复制的一个代码

#include<iostream>

using namespace std;

int cmp(const void *a,const void *b)

{

return *(int *)a-*(int *)b;

}

int main(void)

{

int n,T[1001],K[1001],i,j,s,e,sum;

while(cin>>n&&n)

{

sum=0;

for(i=0;i<n;i++) cin>>T[i];

for(i=0;i<n;i++) cin>>K[i];

qsort(T,n,sizeof(int),cmp);

qsort(K,n,sizeof(int),cmp);



i=s=0;j=e=n-1;sum=0;

while(i<=j)

{

if(T[i]>K[s]) {sum++;s++;i++;}

else if(T[i]<K[s]){sum--;e--;i++;}

else

{

if(T[j]>K[e]) {sum++;e--;j--;}

else{if(T[i]<K[e])sum--;e--;i++;}

}

}

cout<<200*sum<<endl;

}

//system("pause");

return 0;

}

因为数据百度上很容易搜到,在这里就不在附上数据了

/*

#include<stdio.h>

int main()

{

int n,s,i,j,sub=0,sum=0;

int tfast,tslow,wfast,wslow; //分别代表田的最快马,最慢马,王的最快马,最慢马

int t[1000],w[1000];

while(scanf("%d",&n)&&(n!=0))

{

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

scanf("%d",&t[i]);

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

scanf("%d",&w[i]);

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

for(j=0;j<n-1-i;j++)

if(t[j]<t[j+1])

{s=t[j];t[j]=t[j+1];t[j+1]=s;}

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

for(j=0;j<n-1-i;j++)

if(w[j]<w[j+1])

{s=w[j];w[j]=w[j+1];w[j+1]=s;} //由大到小排序

tfast=0;tslow=n-1;

wfast=0;wslow=n-1; //最快最慢马的初始化



for(i=0;i<n;i++) //分三种情况

{

if(t[tfast]==w[wfast]) //情况1

{

if(t[tslow]>w[wslow]){sub++;tslow--;wslow--;}

else if(t[tslow]<w[wslow]){sub--;tslow--;wfast++;}

else if(t[tslow]==w[wslow])

{

if(t[tslow]<w[wfast]){sub--;tslow--;wfast++;}

else if(t[tslow]==w[wfast]){break;}

}

}

else if(t[tfast]>w[wfast]) //情况2

{sub++;tfast++;wfast++;}

else {sub--;tslow--;wfast++;} //情况3

}

sum=sub*200;

printf("%d\n",sum);

sub=0;sum=0;

}

}

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: