1,查找
- 题目描写叙述:
-
输入数组长度 n
输入数组 a[1...n]
输入查找个数m
输入查找数字b[1...m]
输出 YES or NO 查找有则YES 否则NO 。
- 输入:
-
输入有多组数据。
每组输入n。然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100)。
- 输出:
-
假设在n个数组中输出YES否则输出NO。
- 例子输入:
-
5 1 5 2 4 3 3 2 5 6
- 例子输出:
-
YES YES NO
总结:这个没技术含量,以下一个好些,简单多了。牵扯到查找,最好用哈希。
#include<iostream> using namespace std; int main(){ int n,m; int i,j; int swap,find; while(cin>>n){ int num[101] = {0}; for(i=0;i<n;i++){ cin>>num[i]; } for(i=0;i<n;i++){ for(j=0;j<n-1-i;j++){ if(num[j] > num[j+1]){ swap = num[j]; num[j] = num[j+1]; num[j+1] = swap; } } } cin>>m; for(i=0;i<m;i++){ cin>>find; int mid; int low = 0; int head = n-1; while(low<=head){ mid = (low+head)/2; if(num[mid] == find){ break; } if(num[mid] > find){ head = mid-1; } if(num[mid] < find){ low = mid +1; } } if(num[mid] == find){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } } return 0; }
#include<iostream> using namespace std; int main(){ int n,m; int i,a; int find; while(cin>>n){ int num[101] = {0}; for(i=0;i<n;i++){ cin>>a; num[a] = 1; } cin>>m; for(i=0;i<m;i++){ cin>>find; if(num[find] == 1){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } } }
2,查找第K小数
- 题目描写叙述:
-
查找一个数组的第K小的数。注意相同大小算一样大。
如 2 1 3 4 5 2 第三小数为3。
- 输入:
-
输入有多组数据。
每组输入n。然后输入n个整数(1<=n<=1000)。再输入k。
- 输出:
-
输出第k小的整数。
- 例子输入:
-
6 2 1 3 5 2 2 3
- 例子输出:
-
3
#include<iostream> using namespace std; int main(){ int n; int i,j,k,m; while(cin>>n){ int arr[101000]={0}; for(i=0;i<n;i++){ cin>>m; arr[m] = 1; } cin>>k; j=1; for(i=0;i<101000;i++){ if(arr[i] == 1){ if(j == k){ cout<<i<<endl; break; }else{ j++; } } } } return 0; }
3。打牌
- 题目描写叙述:
-
牌仅仅有1到9,手里拿着已经排好序的牌a。对方出牌b。用程序推断手中牌是否可以压过对方出牌。
规则:出牌牌型有5种
[1]一张 如4 则5...9可压过
[2]两张 如44 则55。66。77,...,99可压过
[3]三张 如444 规则如[2]
[4]四张 如4444 规则如[2]
[5]五张 牌型仅仅有12345 23456 34567 45678 56789五个,后面的比前面的均大。
- 输入:
-
输入有多组数据。
每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表处的牌。
- 输出:
-
压过输出YES 否则NO。
- 例子输入:
-
12233445566677 33
- 例子输出:
-
YES
#include<iostream> #include<string> using namespace std; int main(){ string a,b; int i,j,h; while(cin>>a>>b){ bool flag = false; int arr[10]={0}; for(i=0;i<a.length();i++){ h = a[i] - '0'; arr[h]++; } if(b.length() >= 1 && b.length() <= 4){ j = b.length(); h = b[0] - '0'; for(i=0;i<10;i++){ if(i>h && arr[i] > j){ flag = true; break; } } } if(b.length() == 5){ int min = b[0] - '0'; for(i=min+1;i<10;i++){ for(j=0;j<5;j++){ if(arr[i+j] == 0){ break; } if(j == 4){ flag = true; break; } } } } if(flag){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } return 0; }
4,树查找
- 题目描写叙述:
-
有一棵树,输出某一深度的全部节点,有则输出这些节点,无则输出EMPTY。
该树是全然二叉树。
- 输入:
-
输入有多组数据。
每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入。再输入一个d代表深度。
- 输出:
-
输出该树中第d层得全部节点,节点间用空格隔开。最后一个节点后没有空格。
- 例子输入:
-
4 1 2 3 4 2
- 例子输出:
-
2 3
#include<iostream> using namespace std; #define min_num -1000 int main(){ int n,m; int i,j,k; while(cin>>n){ int arr[1010]; for(i=0;i<1010;i++){ arr[i] = min_num; } for(i=1;i<=n;i++){ cin>>arr[i]; } cin>>m; k=1; for(i=1;i < m;i++){ k*=2; } j=0; for(i=k;i <= k*2-1;i++){ if(arr[i] != min_num){ j++; } } if(j==0){ cout<<"EMPTY"<<endl; }else{ for(i=0;i<j-1;i++){ cout<<arr[k+i]<<" "; } cout<<arr[k+j-1]<<endl; } } return 0; }