2010.网研.Problem A.查找
链接: 牛客网 - 查找
输入
输入数组长度 n
输入数组 a[1…n]
输入查找个数m
输入查找数字b[1…m]
输出
输出 YES or NO 查找有则 YES 否则 NO
样例输入:
5(数组长度)
1 5 2 4 3(数组)
3(查找个数)
2 5 6(查找具体数字)
样例输出
YES
YES
NO
参考代码
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000;
int num[maxn];
int main()
{
int n, m;
cin >> n;
for( int i = 0; i < n; i++ )
cin >> num[i];
cin >> m;
sort( num, num+n );
int sch;
int low, high, mid;
while( m-- )
{
cin >> sch;
bool flag = false;
low = 0;
high = n-1;
while( low <= high )
{
mid = (low+high)/2;
if( num[mid] == sch )
{
cout << "YES" << endl;
flag = true;
break;
}
else if( num[mid] a< sch )
low = mid+1;
else
high = mid-1;
}
if( !flag )
cout << "NO" << endl;
}
return 0;
}
2010.网研.Problem B.查找第K小数
链接: 牛客网 - 查找第K小数
题意
查找一个数组的第K 小的数,注意同样大小算一样大
如 2 1 3 4 5 2 第三小数为 3
样例输入:
6(数组长度 n)
2 1 3 5 2 2(数组)
3(K 即为第三小数)
样例输出:
3
参考代码
/*
两个同样大的数算一样大 排序需要去重
此题最多为1000个数 直接用STL Set解决 驱动去重排序 时间复杂度O(nlogn)
*/
#include <iostream>
#include <set>
using namespace std;
set<int> S;
int main()
{
int n, num;
cin >> n;
while( n-- )
{
cin >> num;
S.insert( num );
}
int k;
cin >> k;
k--;
set<int>::iterator it = S.begin();
while( k-- )
it++;
cout << *it << endl;
}
2010.网研.Problem C.打牌
链接: 牛客网 - 打牌
题目描述
牌只有 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 五个,后面的比前面的均大压过输出YES 否则NO
样例输入:
12233445566677(手中牌)
33(出牌)
样例输出:
YES
参考代码
#include <iostream>
#include <string>
using namespace std;
int maxn = 50;
int main()
{
string myCard, yourCard;
cin >> myCard;
int cnt[10] = {0};
int num = myCard.size();
for( int i = 0; i < num; i++ )
cnt[ myCard[i]-'0' ]++;
int five[10] = {0};
for( int i = 1; i < 10; i++ )
if( cnt[i] && cnt[i-1] )
five[i] = five[i-1]+1;
else if( cnt[i] )
five[i] = 1;
else
five[i] = 0;
cin >> yourCard;
int type = yourCard.size();
int c1 = yourCard[0]-'0';
int c5;
if( type == 5 )
c5 = yourCard[4]-'0';
bool flag = false;
if( type <= 4 )
for( int i = c1+1; i < 10; i++ )
{
if( cnt[i] >= type )
{
flag = true;
break;
}
}
else
for( int j = c5+1; j < 10; j++ )
if( five[j] >= 5 )
{
flag = true;
break;
}
if( flag )
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
2010.网研.Problem D.树 查找
链接: 牛客网 - 树 查找
题目描述
有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入描述:
输入有多组数据。
每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出描述:
输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
示例1
输入
4
1 2 3 4
2
输出
2 3
参考代码
/* 完全二叉树 高度为h的节点 编号为 [2^(h-1) 2^h-1];*/
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1010;
int A[maxn];
int main()
{
int n, m;
cin >> n;
for( int i = 1; i <= n; i++ )
cin >> A[i];
cin >> m;
int l = (int)pow( double(2), double(m-1) );
int r = (int)pow( double(2), double(m) );
bool firstCase = true;
bool flag = false;
for( int i = l; i <= n && i < r; i++ )
{
flag = true;
if( firstCase )
firstCase = false;
else
cout << " ";
cout << A[i];
}
if( !flag )
cout << "EMPTY" << endl;
return 0;
}
本文精选了算法竞赛中的经典题目,包括查找算法、树结构操作、牌类游戏策略分析及完全二叉树节点查找,提供了详细的题解和参考代码,适合算法初学者和竞赛选手学习。

被折叠的 条评论
为什么被折叠?



