codeforces 358A Dima and Continuous Line
題意理解:
給一出個n,然後輸入n個數,表示一個一維數組上的座標點,相鄰的兩點有連線(首尾兩點不相鄰)。判斷這些連線是否相交,如果相交輸出“yes”,否則輸出“no”。
思路分析:
首先應該明白什麼時候輸出“yes”,什麼時候輸出“no”:
一旦有相交的連線,輸出“yes”,後面的一切數據都不必再判斷處理,只要輸入就好;
如果所有的數據都已經輸入並判斷處理了,沒有發現相交的連線,輸出“no”。
然後,怎麼判斷兩條連線是否相交:
若第一條連線的端點是x1,y1(x1<y1),現在給出的連線的端點是x,y(x<y);
兩條連線相交的充分必要條件就是x<x1&&y>x1&&y<y1或x<y1&&x>x1&&y>y1;
兩條連線,一旦滿足兩個條件的其中一個,就說明兩條連線相交了。
最後,思路整理,代碼編輯。
思路:先輸入直到可以比較判斷(輸入的點大於2),
<1>若n<=2,連線不超過1條,不可能相交,輸出“no”
<2>否則,對於現在輸入的點和前面一點的連線和前面所有的點的連線進行判斷處理,一旦發現有相交現象,輸出結果確定爲“no”,後面的輸入照常,數據部進行比較處理;
若所有數據輸入完成並比較完成,未發現有相交現象,輸出結果確定爲“yes”。
4926441 | Oct 29, 2013 8:47:20 AM | 20114045007 | 358A - Dima and Continuous Line | GNU C++ | Accepted | 15 ms | 0 KB |
#include<stdio.h> #include<algorithm> using namespace std; int main() { int point[1005]; int n,t; int flag; int x,y,x1,y1; int i,j; while(scanf("%d",&n)!=EOF) { t=0; flag=0; //標記是否相交,相交爲1,否則爲0 //先輸入2點的座標,才能判斷是否相交; //若是點數不超過2,自然不能相交; //但是爲了後面輸入不出錯,本組輸入必須完成 scanf("%d",&x); point[t++]=x; if(n>=2) scanf("%d",&x); if(n>2) //弱點數超過2,判斷是否相交 { point[t++]=x; n-=2; while(n--) //將後面的點輸入,同時判斷該點和前面已點的連線是否有相交情況 { scanf("%d",&y); if(flag)continue; //前面判斷已經證明有相交情況,不必再判斷 point[t++]=y; if(x>y)swap(x,y); //將當前要判斷的兩點先小後大 for(i=0;i<t-1;i++) //將該連線和前面所有連線比較處理,看是否相交 { x1=point[i]; y1=point[i+1]; //取前面某條連線與該連線比較處理,看是否相交 if(x1>y1)swap(x1,y1); if(x<x1&&y>x1&&y<y1||x<y1&&x>x1&&y>y1) //判斷是否相交 { flag=1; break; } } x=point[t-1]; } } printf(flag?"yes":"no"); printf("\n"); } return 0; }