2014-06-10 23:34:23》》思路:先按从小到大排序, 然后从最快的开始比(假设i, j 是最慢的一端, flag1, flag2是最快的一端 ),田的最快的大于king的 则比较,如果等于然后判断,有三种情况:
一:大于则比较,二等于在判断田的最慢的是不是比king的最快的慢,三小于则与king的最快的比较;
代码1:
#include<stdio.h>
#include<algorithm>
using std::sort;
int cmp( int a, int b )
{
if( a < b ) return true;
return false;
}
int main()
{
int t[1005], k[1005], n, i, j, c;
while( scanf( "%d", &n ), n )/*跟nyoj上面的结束条件不一样,其他都一样*/
<span style="white-space:pre"> </span>{
c = 0;
for( i = 0; i < n; i ++ )
scanf( "%d", &t[i] );
sort( t, t+n, cmp );
for( i = 0; i < n; i ++ )
scanf( "%d", &k[i] );
sort( k, k + n, cmp );
i= j = 0;
int flag1= n-1, flag2 = n-1;//flag1是田的
while( i <= flag1 )
{
if( t[flag1] > k[flag2] )
{
++c;
--flag1;
--flag2;
}
else if( t[flag1] == k[flag2] )
{
if( t[i]>k[j] )
{
++c;
++i;
++j;
}
else if( t[i] == k[j] )
{
if( t[i] < k[flag2] ) --c; //注意这处wa了好几次
++i;
--flag2;
}
else if( t[i] < k[j] )
{
--c;
++i;
--flag2;
}
}
else
{
--c;
++i;
--flag2;
}
}
printf( "%d\n", c*200 );
}
}
2014-08-25 23:39:31》》(隔了好久,想起来又做了一遍)思路都差不多,
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define M 1005
using namespace std;
int t[M], k[M];
int solve(int n){
int ti, kj, tflag, kflag;
int win = 0, los = 0;
ti = kj = 0;
tflag = kflag = n-1;
while(ti <= tflag){
if(t[ti] > k[kj]){
++ti; ++kj;
win ++;
}
else if(t[ti] <= k[kj]){
while(t[tflag] > k[kflag]){
--tflag; -- kflag;
++win;
}
if(t[tflag] <= k[kflag]){
if(t[ti] < k[kflag]) ++los;
++ti; --kflag;
}
}
}
return win-los;
}
int main(){
int n, i;
while(scanf("%d", &n) == 1){
for(i = 0; i < n; i ++){
scanf("%d", &t[i]);
}
for(i = 0; i < n; i ++){
scanf("%d", &k[i]);
}
sort(t, t+n);
sort(k, k+n);
int res = solve(n);
printf("%d\n", res*200);
}
return 0;
}
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1052