组队竞赛
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
int main ( )
{
int n;
cin >> n;
vector< int > v;
v. resize ( 3 * n) ;
int i = 0 ;
for ( i = 0 ; i < v. size ( ) ; ++ i)
{
cin >> v[ i] ;
}
sort ( v. begin ( ) , v. end ( ) ) ;
long long sum = 0 ;
while ( n-- )
{
sum += v[ i -= 2 ] ;
}
cout << sum;
return 0 ;
}
删除公共字符
# include <iostream>
# include <string>
# include <cstring>
using namespace std;
int main ( )
{
string s1;
getline ( cin, s1) ;
string s2;
getline ( cin, s2) ;
int hashtable[ 256 ] ;
memset ( hashtable, 0 , sizeof ( hashtable) ) ;
for ( char c2 : s2)
{
hashtable[ c2] = 1 ;
}
string ret;
for ( char c1 : s1)
{
if ( hashtable[ c1] == 0 )
{
ret += c1;
}
}
cout << ret;
return 0 ;
}
排序子序列
# include <iostream>
# include <vector>
using namespace std;
int trend ( int a, int b)
{
if ( a < b)
return 0 ;
else
return 1 ;
}
int main ( )
{
int n;
cin >> n;
if ( n < 3 )
{
cout << 1 ;
exit ( 0 ) ;
}
int a, b;
cin >> a >> b;
n -= 2 ;
int flag = 0 ;
int count = 0 ;
while ( 1 )
{
flag = trend ( a, b) ;
a = b;
if ( n-- == 0 )
break ;
cin >> b;
if ( ( flag == 0 && a > b) || ( flag == 1 && a < b) )
{
++ count;
a = b;
if ( n-- == 0 )
break ;
cin >> b;
}
}
cout << count + 1 ;
return 0 ;
}
字符串中找出连续最长的数字串
# include <iostream>
using namespace std;
int main ( )
{
string s;
cin >> s;
int tmpstart = 0 ;
int tmpend = 0 ;
int start = 0 ;
int end = 0 ;
int max = 0 ;
for ( size_t i = 0 ; i < s. size ( ) ; ++ i)
{
if ( s[ i] >= '0' && s[ i] <= '9' )
{
tmpstart = i;
tmpend = i;
while ( tmpend < s. size ( ) && s[ tmpend] >= '0' && s[ tmpend] <= '9' )
{
++ tmpend;
}
i = tmpend - 1 ;
if ( tmpend - tmpstart > max)
{
max = tmpend - tmpstart;
start = tmpstart;
end = tmpend;
}
}
else
{
++ i;
}
}
for ( size_t i = start; i < end; ++ i)
{
cout << s[ i] ;
}
return 0 ;
}
计算糖果
# include <iostream>
using namespace std;
int main ( )
{
int num[ 4 ] ;
for ( int & n : num)
{
cin >> n;
}
int B = ( num[ 2 ] - num[ 0 ] ) / 2 ;
int C = ( num[ 3 ] - num[ 1 ] ) / 2 ;
if ( B == C + num[ 1 ] )
{
cout << B + num[ 0 ] << " " << B << " " << C;
}
else
{
cout << "No" ;
}
return 0 ;
}
进制转换
# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;
int main ( )
{
int num, n;
cin >> num >> n;
if ( num == 0 )
{
cout << 0 ;
exit ( 0 ) ;
}
string s, table = "0123456789ABCDEF" ;
int flag = false ;
if ( num < 0 )
{
flag = true ;
num = - num;
}
while ( num)
{
s += table[ num % n] ;
num /= n;
}
reverse ( s. begin ( ) , s. end ( ) ) ;
if ( flag)
{
cout << "-" ;
}
for ( char i : s)
{
cout << i;
}
return 0 ;
}
连续最大和
# include <iostream>
using namespace std;
int main ( )
{
int n;
cin >> n;
int sum, max, num;
cin >> sum;
max = sum;
for ( size_t i = 1 ; i < n; ++ i)
{
cin >> num;
sum += num;
if ( sum < num)
{
sum = num;
}
if ( sum > max)
{
max = sum;
}
}
cout << max;
return 0 ;
}
不要二
# include <iostream>
# include <cstring>
using namespace std;
int main ( )
{
int H, W;
cin >> H >> W;
int arr[ H] [ W] ;
memset ( arr, 1 , sizeof ( arr) ) ;
int count = 0 ;
for ( int h = 0 ; h < H; ++ h)
{
for ( int w = 0 ; w < W; ++ w)
{
if ( arr[ h] [ w] )
{
++ count;
if ( w + 2 < W)
{
arr[ h] [ w + 2 ] = 0 ;
}
if ( h + 2 < H)
{
arr[ h + 2 ] [ w] = 0 ;
}
}
}
}
cout << count;
return 0 ;
}
从根到叶的二进制数之和
class Solution {
public :
void recursion ( TreeNode* root, int num, int & sum)
{
if ( root == nullptr )
{
return ;
}
num = ( num << 1 ) + root-> val;
if ( root-> left || root-> right)
{
recursion ( root-> left, num, sum) ;
recursion ( root-> right, num, sum) ;
}
else
{
sum += num;
}
}
int sumRootToLeaf ( TreeNode* root)
{
int sum = 0 ;
recursion ( root, 0 , sum) ;
return sum;
}
} ;
二叉树的坡度
class Solution {
public :
int getSum ( TreeNode* root)
{
if ( root == nullptr )
{
return 0 ;
}
return root-> val + getSum ( root-> left) + getSum ( root-> right) ;
}
int findTilt ( TreeNode* root)
{
if ( root == nullptr )
{
return 0 ;
}
return findTilt ( root-> left) + findTilt ( root-> right) + abs ( getSum ( root-> left) - getSum ( root-> right) ) ;
}
} ;
两种排序方法
void test ( )
{
int n = 0 ;
cin >> n;
bool lexicographically = true ;
bool lengths = true ;
string s1;
string s2;
cin >> s1;
for ( int i = 1 ; i < n; ++ i)
{
cin >> s2;
if ( s1 > s2)
{
lexicographically = false ;
}
if ( s1. size ( ) > s2. size ( ) )
{
lengths = false ;
}
s1 = s2;
}
if ( lexicographically && lengths)
{
cout << "both" ;
return ;
}
if ( lexicographically)
{
cout << "lexicographically" ;
return ;
}
if ( lengths)
{
cout << "lengths" ;
return ;
}
cout << "none" ;
}
走方格的方案数
int dp ( int n, int m)
{
if ( n == 1 || m == 1 )
{
return n + m;
}
return dp ( n - 1 , m) + dp ( n, m - 1 ) ;
}
另类加法
int addAB ( int A, int B)
{
while ( A & B)
{
int a = A ^ B;
int b = ( A & B) << 1 ;
A = a;
B = b;
}
return A | B;
}
查找组成一个偶数最接近的两个素数
bool isPrime ( int num)
{
for ( int i = 2 ; i <= sqrt ( num) ; ++ i)
{
if ( num % i == 0 )
{
return false ;
}
}
return true ;
}
int main ( )
{
int n = 0 ;
cin >> n;
int half = n / 2 ;
while ( half)
{
if ( isPrime ( half) && isPrime ( n- half) )
{
cout << half << endl;
cout << n- half << endl;
break ;
}
-- half;
}
return 0 ;
}
参数解析
int main ( )
{
string str;
getline ( cin, str) ;
bool flag = false ;
vector< string> v;
string str2;
for ( size_t i = 0 ; i < str. size ( ) ; ++ i)
{
if ( str[ i] == '"' )
{
flag = ! flag;
continue ;
}
if ( str[ i] != ' ' )
{
str2 += str[ i] ;
}
else if ( flag == true )
{
str2 += " " ;
}
else if ( flag == false )
{
v. emplace_back ( str2) ;
str2. resize ( 0 ) ;
}
}
v. emplace_back ( str2) ;
cout << v. size ( ) << endl;
for ( size_t i = 0 ; i < v. size ( ) ; ++ i)
{
cout << v[ i] << endl;
}
return 0 ;
}
跳石板
int step ( int n, int m)
{
int * p = new int [ m + 1 ] ;
for ( int i = 1 ; i <= m; ++ i)
{
p[ i] = - 1 ;
}
p[ n] = 0 ;
while ( n < m)
{
for ( int i = 2 ; i <= sqrt ( n) ; ++ i)
{
if ( n % i == 0 )
{
if ( n + i <= m && p[ n + i] == - 1 )
{
p[ n + i] = p[ n] + 1 ;
}
else if ( n + i <= m)
{
if ( p[ n] + 1 < p[ n + i] )
p[ n + i] = p[ n] + 1 ;
}
if ( n + n / i <= m && p[ n + n / i] == - 1 )
{
p[ n + n / i] = p[ n] + 1 ;
}
else if ( n + n / i <= m)
{
if ( p[ n] + 1 < p[ n + n / i] )
p[ n + n / i] = p[ n] + 1 ;
}
}
}
while ( ++ n < m && p[ n] == - 1 ) ;
}
return p[ m] == - 1 ? - 1 : p[ m] ;
}
幸运的袋子
int getLuckyBag ( vector< int > & v, int size, int pos, int sum, int product)
{
int count = 0 ;
for ( int i = pos; i < size; ++ i)
{
sum += v[ i] ;
product *= v[ i] ;
if ( sum > product)
count += 1 + getLuckyBag ( v, size, i + 1 , sum, product) ;
else if ( v[ i] == 1 )
count += getLuckyBag ( v, size, i + 1 , sum, product) ;
else
break ;
sum -= v[ i] ;
product /= v[ i] ;
while ( i < size - 1 && v[ i] == v[ i + 1 ] )
++ i;
}
return count;
}
int main ( )
{
int n;
while ( cin >> n)
{
vector< int > v ( n) ;
for ( int i = 0 ; i < n; ++ i)
cin >> v[ i] ;
sort ( v. begin ( ) , v. end ( ) ) ;
cout << getLuckyBag ( v, v. size ( ) , 0 , 0 , 1 ) << endl;
}
return 0 ;
}
手套
int findMinimum ( int n, vector< int > left, vector< int > right)
{
int left_sum = 0 , left_min = 26 ;
int right_sum = 0 , right_min = 26 ;
int sum = 0 ;
for ( int i = 0 ; i < n; ++ i)
{
if ( left[ i] * right[ i] == 0 )
{
sum += ( left[ i] + right[ i] ) ;
}
else
{
left_sum += left[ i] ;
if ( left[ i] < left_min)
{
left_min = left[ i] ;
}
right_sum += right[ i] ;
if ( right[ i] < right_min)
{
right_min = right[ i] ;
}
}
}
return sum + min ( left_sum - left_min + 1 , right_sum - right_min + 1 ) + 1 ;
}
扑克牌大小
# include <iostream>
# include <vector>
# include <string>
using namespace std;
# define gezi_space 0
# define duizi_sapce 1
# define sange_sapce 2
# define zhadan_sapce 3
# define shunzi_sapce 4
const vector< string> poker = {
"3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" , "J" , "Q" , "K" , "A" , "2" , "joker" , "JOKER" } ;
int get_space_count ( const string& str)
{
int space_count = 0 ;
for ( char c : str)
{
if ( c == ' ' )
{
++ space_count;
}
}
return space_count;
}
string poker_judge ( const string& left, const string& right)
{
if ( left == "joker JOKER" || right == "joker JOKER" )
{
return "joker JOKER" ;
}
int left_space_count = get_space_count ( left) ;
int right_space_count = get_space_count ( right) ;
if ( left_space_count == right_space_count)
{
string left_0 = left. substr ( 0 , left. find ( ' ' ) ) ;
string right_0 = right. substr ( 0 , right. find ( ' ' ) ) ;
int left_index = 0 ;
int right_index = 0 ;
for ( int i = 0 ; i < poker. size ( ) ; ++ i)
{
if ( left_0 == poker[ i] )
{
left_index = i;
}
if ( right_0 == poker[ i] )
{
right_index = i;
}
}
if ( left_index > right_index)
{
return left;
}
else
{
return right;
}
}
else if ( left_space_count == zhadan_sapce)
{
return left;
}
else if ( right_space_count == zhadan_sapce)
{
return right;
}
else
{
return "ERROR" ;
}
}
int main ( )
{
string str;
while ( getline ( cin, str) )
{
size_t pos = str. find ( '-' ) ;
string left ( str. begin ( ) , str. begin ( ) + pos) ;
string right ( str. begin ( ) + pos + 1 , str. end ( ) ) ;
cout << poker_judge ( left, right) << endl;
}
return 0 ;
}