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;
}