YES or NO
现在给你一个整数n,可以将其转化为二进制数,你现在可以删除这个二进制数中的任意位(例如10101,你可以删除第三位的1,变为1001),问你最后剩下的二进制数能不能被64整除,如果可以被整除输出“yes”,否则输出“no”
数据范围:
0<=n<=2^63 - 1
补题的时候 再次忘记 long long 这是第几次死在 long long 上了 …
法一
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
int main ( ) { // freopen( "F:\\in\\.txt" , "r" , stdin );
ll n;
cin >> n;
bitset<64> bt( n ); // 记住 bitset 遍历是从最低位到最高位的, 即 从右向左 !!!
// cout << "[ bitset ] : " << endl << bt << endl;
int pos_high = 0; // 记录最高位的位置
int len_bt = bt.size( );
for ( int i = 0; i < len_bt; ++i )
if ( bt[i]==1 )
pos_high = i;
int cnt0 = 0; // 统计最低位到最高位一共有几个0
for ( int i = 0; i <= pos_high; ++i )
if ( bt[i]==0 ) cnt0++;
else if ( cnt0==6 ) break;
cout << ( cnt0>=6 ? "yes" : "no" ) << endl;
return 0 ;
}
法二
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
ll n,
k = 0,
num[64];
int main ( ) { // freopen( "F:\\in\\.txt" , "r" , stdin );
cin >> n;
while ( n ) {
num[k++] = n%2;
n /= 2;
}
int cnt0 = 0;
for ( int i = 0; i < k; ++i )
if ( num[i]==0 ) cnt0++;
else if ( cnt0==6 ) break;
cout << ( cnt0==6 ? "yes" : "no" ) << endl;
return 0 ;
}
AK爷兼职
给定的n个数, 输出最大组合
这和之前做过的一个cf题很像, 求最大排列, 不就是最大的字符串的字典序逆序输出嘛 …
可惜做这个题的时候傻了, 连想字典序都没有, 一直往数位大小方向考虑, 由于 I 的一直wa 越做这个越急躁, 最后直接做不进去了
还是太菜了
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
const int maxn = 1e5+100;
string s[maxn];
int main ( ) { // freopen( "F:\\in\\.txt" , "r" , stdin );
int n;
cin >> n;
for ( int i = 0; i < n; ++i )
cin >> s[i];
sort( s, s+n, [&](const string& a, const string& b)->bool{
return a+b > b+a;
} );
for ( string t : s )
cout << t;
return 0 ;
}
Bob的难题
简单的模拟, 按照步骤来就行了, 比赛时候最后太急躁了, 哎 … 大水题
心态要稳啊
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
string str, sa, sb,
temp;
int main ( ) { // freopen( "F:\\in\\.txt" , "r" , stdin );
str = "";
sa = "";
sb = "";
temp = ""; // temp 字符串中是 str 中 出去 'a' 后的字符串
cin >> str;
for ( char i : str )
if ( i!='a' )
temp += i;
// cout << "[temp ] : "<< temp << endl;
int len_temp = temp.size();
if ( len_temp&1 ) cout << ":(" << endl; // 如果除去 'a' 的字符串个数是奇数, 那么肯定不能拼成
else {
bool ans = true; // 比较去 'a' 的字符串 是否有两个折半相等的子串
int len_sb = len_temp/2;
for ( int i = 0; i < len_sb; ++i ) {
if ( temp[i]!=temp[i+len_sb] ) {
ans = false;
break;
}
}
if ( ans ) { // 此时 就可以按题意要求比较了
int len_sa = str.size()-len_sb;
for ( int i = 0; i < len_sa; ++i )
sa += str[i];
sb = temp.substr( 0, len_sb );
// cout << "[sa ] : "<< sa << endl;
// cout << "[sb ] : "<< sb << endl;
// cout << "[str ] : "<< str << endl;
cout << ( str==sa+sb ? sa : ":(" ) << endl;
} else cout << ":(" << endl;
}
return 0 ;
}
树
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
const int maxn = 6e3+100;
const int maxm = 6e3+100;
struct EDGE {
int u, v, w;
}e[maxm];
int n, m,
u, v, w,
tot[maxn];
ll ans;
int root[maxn];
void ini ( int n ) {
for ( int i = 1; i <= n; ++i ) root[i] = i;
for ( int i = 1; i <= n; ++i ) tot[i] = 1;
}
int get ( int x ) {
return root[x]==x ? x : root[x]=get( root[x] );
}
bool merge ( int x, int y, int w ) {
int rx = get( x ), ry = get( y );
if ( rx==ry ) return false;
root[ry] = rx;
ans += (w+1)*(tot[rx]*tot[ry]-1);
tot[rx] += tot[ry];
return true;
}
int main ( ) { // freopen( "F:\\in\\.txt" , "r" , stdin );
int T;
sc( "%d", &T );
while ( T-- ) {
ans = 0;
sc( "%d", &n );
m = n-1;
for ( int i = 1; i <= m; ++i )
sc( "%d%d%d", &e[i].u, &e[i].v, &e[i].w );
ini( n );
sort( e+1, e+m+1, [&]( const EDGE& u, const EDGE& v )->bool{
return u.w < v.w;
} );
for ( int i = 1; i <= m; ++i )
merge( e[i].u, e[i].v, e[i].w );
cout << ans << endl;
}
return 0 ;
}
这个完全是纪念一下我清新脱俗的代码风格~
#include <bits/stdc++.h>
using namespace std;
#define rg register
#define sc scanf
#define pf printf
typedef long long ll;
int main ( ) { // freopen( "F:\\in\\.txt" , "r" , stdin );
int n;
cin >> n;
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < n; ++j ) {
cout << "XXXXX";
}
cout << endl;
}
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < 3; ++j ) {
for ( int k = 0; k < n; ++k ) {
cout << "X";
}
for ( int k = 0; k < n; ++k ) {
cout << "WFU";
}
for ( int k = 0; k < n; ++k ) {
cout << "X";
}
cout << endl;
}
}
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < n; ++j ) {
cout << "XXXXX";
}
cout << endl;
}
return 0 ;
}
```