HD1052

这题的确是有点坑爹,第一次贪心的数据这么恶心,情况也多,这题只要你坚持几点就可以了。

(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])      //否则,则用田忌最慢的马赛王最快的马
{
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;




}
    


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

#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;
  }
}


  */




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值