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;
}
}
*/
(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;
}
}
*/
相关文章推荐
- 回文判断
- android 开发工具分享
- 关于MapReduce
- 框架搭建1-----spring3+hibernate4+mysql
- 【Qt学习笔记】Qt+VS2010的配置
- SQL删除重复数据只保留一条语句
- 【Qt学习笔记】Qt+VS2010的配置
- Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor
- Distributed Management Task Force----分布式管理任务组
- 初识Hadoop
- 深入理解指针函数
- 关闭一些不用的端口
- InChatter系统之服务器开发(二)
- div高度自适外层div高度随里层div高度自适
- SQL TOP分页
- 磨刀不误砍柴工——VS生成事件
- URAL 1971 Graphics Settings
- 填个许久的坑,计算表达式的值
- 国内各视频网站android pad客户端支持分辨率情况初步统计
- MFC程序执行顺序