Codeforces Round #735 (Div. 2) (A-D)

传送门

A . 思路:对于一个很大的数,区间越大最小的数是越小的,他们的乘积也就越小,所以枚举相邻两个数就行了。

#include<bits/stdc++.h>
using namespace std;
 
#define lsn (u << 1)
#define rsn (u << 1 | 1)
#define mid (l + r >> 1)
 
typedef long long ll;
typedef unsigned long long ull;
 
typedef pair<double, double> P;
 
const int MAXN = 1e5 + 10;
const int MAX_LEN = 1e5 + 10;
const int MAX_LOG_V = 22;
const ll INF = 1e17;
const int inf = 0x3f3f3f3f;
const int mod = 19650827;
const double eps = 1e-7;
const ull B = 100000007;

int n;
ll a[MAXN];

void solve() {
	scanf("%d", &n);
	ll ans = 0;
	for(int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]); 
	}
	for(int i = 1; i < n; i++) {
		ans = max(min(a[i],a[i+1])*max(a[i],a[i+1]), ans);
	}
	printf("%lld\n", ans);
}


int main() {
	//ios::sync_with_stdio(false);
	int t = 1; scanf("%d", &t);  
	while(t--) { 
		solve();
	}
}

B: 思路:枚举后100个就行了。。。。

#include<bits/stdc++.h>
using namespace std;
 
#define lsn (u << 1)
#define rsn (u << 1 | 1)
#define mid (l + r >> 1)
 
typedef long long ll;
typedef unsigned long long ull;
 
typedef pair<double, double> P;
 
const int MAXN = 1e5 + 10;
const int MAX_LEN = 1e5 + 10;
const int MAX_LOG_V = 22;
const ll INF = 1e17;
const int inf = 0x3f3f3f3f;
const int mod = 19650827;
const double eps = 1e-7;
const ull B = 100000007; 
 
 
int n, k;
int a[MAXN];
 
void solve() {
	scanf("%d %d", &n, &k);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
	ll ans = -1e17;
	for(int i = max(1, n-1000); i <= n; i++) {
		for(int j = i+1; j <= n; j++) {
			ans = max(ans, (ll)i*j-(ll)k*(a[i]|a[j]));
		}
	}
	printf("%lld\n", ans);
}
 
 
int main() {
	//ios::sync_with_stdio(false);
	int t = 1; scanf("%d", &t);
	while(t--) {
		solve();
	}
	return 0;
}

C 思路:观察发现 n > m n > m n>m时 0 取不到,直接输出0。当 n < = m n <= m n<=m时 令 n ⨁ x = y n \bigoplus x = y nx=y,根据题目要求,我们要找到一个y使 x > m x > m x>m且 y 最小。 n ⨁ y > m n \bigoplus y > m ny>m , y ⨁ \bigoplus n >= m + 1,怎么找最小的y呢,我们知道在二进制位中一个 2 i > ∑ j = 0 i − 1 2 j 2^i > \sum_{j=0}^{i-1} 2^j 2i>j=0i12j, 故只有当二进制位上n为0,m为1时我们才让y取1。

#include<bits/stdc++.h>
using namespace std;
 
#define lsn (u << 1)
#define rsn (u << 1 | 1)
#define mid (l + r >> 1)
 
typedef long long ll;
typedef unsigned long long ull;
 
typedef pair<double, double> P;
 
const int MAXN = 1e5 + 10;
const int MAX_LEN = 1e5 + 10;
const int MAX_LOG_V = 22;
const ll INF = 1e17;
const int inf = 0x3f3f3f3f;
const int mod = 19650827;
const double eps = 1e-7;
const ull B = 100000007; 


int n, m;


void solve() {
	scanf("%d %d", &n, &m);
	if(n > m) {puts("0"); return ;}
	m++;
	int res = 0;
	for(int i = 30; i >= 0; i--) {
		if(!(n >> i & 1) && (m >> i & 1)) res |= (1 << i);
		else if((n >> i & 1) && !(m >> i & 1)) break;
	}
	printf("%d\n", res);
}


int main() {
	//ios::sync_with_stdio(false);
	int t = 1; scanf("%d", &t);
	while(t--) {
		solve();
	}
	return 0;
}

D 思路:研究一下样例发现,一连串含相同字符的字符串 ( 如 a a a a a ) (如aaaaa) (aaaaa)当再往后添加一个相同字符时,添加后相同长度的子串的个数为添加前的+1,一奇一偶相加肯定为奇数。特判一下n为1的情况

#include<bits/stdc++.h>
using namespace std;
 
#define lsn (u << 1)
#define rsn (u << 1 | 1)
#define mid (l + r >> 1)
 
typedef long long ll;
typedef unsigned long long ull;
 
typedef pair<double, double> P;
 
const int MAXN = 1e5 + 10;
const int MAX_LEN = 1e5 + 10;
const int MAX_LOG_V = 22;
const ll INF = 1e17;
const int inf = 0x3f3f3f3f;
const int mod = 19650827;
const double eps = 1e-7;
const ull B = 100000007; 


int n;


void solve() {
	scanf("%d", &n);
	if(n == 1) {puts("a"); return ;}
	if(n % 2 == 0) {
		int t = n / 2;
		for(int i = 1; i < t; i++) printf("a");
		printf("b");
		for(int i = 1; i <= t; i++) printf("a");
	}
	else {
		int t = n / 2;
		for(int i = 1; i < t; i++) printf("a");
		printf("bc");
		for(int i = 1; i <= t; i++) printf("a");
	}
	puts("");
}


int main() {
	//ios::sync_with_stdio(false);
	int t = 1; scanf("%d", &t);
	while(t--) {
		solve();
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值