WFU第四届程序设计竞赛 补题




wfu oj 传送

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 ; 
} 
```
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值