1.做成之后,检查了三个小时,逐步完善,到最后发现自己把电脑要考虑的工作给做了,需要把所有情况都给列出来,果断放弃。
2.最短时间比较好想,左半部分蚂蚁向左走,右半部分蚂蚁向右走,没有碰撞发生。为所有最短时间中的最长的。 最长时间可能涉及碰撞。碰撞其实相当于穿透,-->AB<-- <--AB--> 相当于<--BA--> 因此碰撞可以不考虑。最长时间就是离一端最远的蚂蚁所用时间。
3.正常的思路应该是先求每个位置到两个端点的距离中的较大的那一个,然后再从这些值里边选取最大最小值。
4.当系统显示accepted的时候,快哭了。。。这题做的太痛苦了,还没有一点算法的思想,思路不清晰
以下是代码
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; int ant[1000000],antsort[1000000]; bool cmp( int a, int b ) { return a < b; } int main() { int n,i,len,antn,j; scanf( "%d", &n ); while( n-- ) { int tmp = 0; int min = 0; memset( ant, 0, sizeof(ant) ); memset( antsort, 0, sizeof(antsort) ); scanf( "%d%d", &len, &antn ); for( i = 0; i < antn; i++ ) { scanf( "%d", &ant[i] ); antsort[i] = ant[i]; } if( antn == 1) { if( ant[0] > len - ant[0] ) printf( "%d %d\n", len - ant[0], ant[0]); else printf( "%d %d\n", ant[0], len - ant[0] ); continue ; } for( int j = 0; j < antn; j++ ) { tmp = ( ant[j] > len - ant[j] ) ? len - ant[j] : ant[j]; if( tmp > min ) min = tmp; } printf( "%d ", min ); sort( antsort, antsort + antn, cmp ); if ( len - antsort[0] > antsort[antn-1] ) printf("%d\n", len - antsort[0] ); else printf("%d\n", antsort[antn-1] ); } return 0; }