aoj0033
一、题意:有十个数,判断是否能分成两个递增序列
二、思路:
1、dfs:每个数判断在左边或者右边,遍历所有情况。
2、贪心:在保证递增序的前提下,判断一个数放左边或者右边,决定于其更接近于哪一边最上面的一个数
三、代码:
1、
#include"iostream" #include"stdio.h" using namespace std; int ball[11]; bool flag; void Dfs(int i,int left,int right) { if(flag) return; if(i==10) {flag=true;return;} if(ball[i]>left) Dfs(i+1,ball[i],right); if(ball[i]>right) Dfs(i+1,left,ball[i]); } int main() { int t; while(scanf("%d",&t)==1) { while(t--){ flag=false; for(int i=0;i<10;i++) cin>>ball[i]; Dfs(0,0,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
2、
#include"iostream" #include"stdio.h" using namespace std; int main() { int t; while(scanf("%d",&t)==1) { while(t--){ int ball,left=0,right=0; bool flag=true; for(int i=0;i<10;i++) { cin>>ball; if(flag){ if(left>ball&&right>ball) { flag=false; } else if(left>ball) { right=ball; } else if(right>ball) { left=ball; } else { if(left>right) left=ball; else right=ball; } } } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }