AtCoder Beginner Contest 221(A-D)

(转自atcoder官网

A - Seismic magnitude scales

因为我们可以假设,当震级增加 1 时,它正好乘以 32 ,所以答案是 [公式]

根据约束条件, A和 B 是整数, [公式] , 因此,可以使用 [公式] 语句计算它。在某些语言中,我们可以用求幂或 [公式] 函数来找到它

#include <bits/stdc++.h>
using namespace std;

int main(void) {
	int a, b;
	int k = 1;
	cin >> a >> b;
	for (int i = b; i < a; i++)k *= 32;
	cout << k << endl;
	return 0;
}

B - typo

我们可以在不执行任何操作的情况下检查 S 和 T 是否相同,或者在每个 [公式] ,交换第 [公式] 个和第 [公式] 个字符时,[公式] 和 [公式] 是否一致.

#include<bits/stdc++.h>
using namespace std;

int main(){
    string S,T; 
    cin >> S >> T;
    string ans = "No";
    if(S == T) ans = "Yes";
    for(int i=0; i<S.size(); i++){
        if(S[i] != T[i]){
            if(0 < i){
                swap(S[i-1],S[i]);
                if(S == T) ans = "Yes";
                swap(S[i-1],S[i]);
            }
            if(i+1 < S.size()){
                swap(S[i],S[i+1]);
                if(S == T) ans = "Yes";
                swap(S[i],S[i+1]);
            }
            break;
        }
    }
    cout << ans << endl;
    return 0;
}

C - Select Mul

最多有 9!*8=903040 种分离方式(或2903040/2=1451520,忽略两个分离整数的顺序时),这足够小。

因此,我们可以用暴力对付所有可能的分离方式。

在 c++ 中实现时,有一个有用的函数称为 next_permutation ,它包含在标准库 [公式] 中。

#include<bits/stdc++.h>
using namespace std;

int main(){
    string N; 
    cin >> N;
    sort(N.begin(),N.end());
    int ans = 0;
    do{
        for(int i=1; i<N.size(); i++){
            string l = "", r = "";
            for(int j=0; j<i; j++) l += N[j];
            for(int j=i; j<N.size(); j++) r += N[j];
            if(l[0]=='0' || r[0]=='0') continue;
            ans = max(ans,stoi(l)*stoi(r));
        }
    }while(next_permutation(N.begin(),N.end()));
    cout << ans << endl;
    return 0;
}

再稍加观察,我们就会发现接受前导零并不影响结果。

#include<bits/stdc++.h>
using namespace std;

int main(){
    string N; 
    cin >> N;
    sort(N.begin(),N.end());//排序,next_permutation只能排已经排好序的全排列
    int ans = 0;
    do{
        for(int i=1; i<N.size(); i++){
            int l = 0, r = 0;
            for(int j=0; j<i; j++) l = l*10+N[j]-'0';//分割线左边的数值
            for(int j=i; j<N.size(); j++) r = r*10+N[j]-'0';//分割线右边的数值
            ans = max(ans,l*r);
        }
    }while(next_permutation(N.begin(),N.end()));//下一个排序
    cout << ans << endl;
    return 0;
}

进一步观察,我们可以看到,当达到最大值时,被分离的两个变量在被视为一个数字序列时是单调不递增的。

根据这个属性,我们可以看到应该检查的分离次数是2^{9}(或2^{8} 如果忽略两个分开的整数的顺序)。

在实现时,使用位强制暴力也是很简单的。

D - Online games

让 x1,x2,...,xn 是一个整数排序序列,由某些玩家开始或退出登录的天数组成;也就是说,X使X= Ai 或X= [公式][公式]

然后,对于任意满足 X 的 <=Y<= [公式][公式] ,在第Y天登录的人数不变。同样,对于 [公式] 的任何 [公式] 或 [公式][公式] , [公式] 人登录,所以我们不必考虑这些天。因此,可以使用一个计数器和一个记录答案的数组来解决这个问题,计数器和数组初始化为 [公式] ,并针对每个 [公式] 进行更新按照以下步骤进行操作:

· 递增计数器 X 我根据第 X 天开始登录的人数i,并减少退出登录的人数。

· 将 C 用户登录的天数增加 xi+1-xi ,其中 [公式] 是计数器的当前值。

#include <bits/stdc++.h>
using namespace std;

#define N 200010
#define rep(i, n) for(int i = 0; i < n; ++i)

int main( ) {
	int n;
	int a, b;
	vector<pair<int, int> >x;
	int cnt;
	int ans[N];
	rep(i, N)ans[i] = 0;

	cin >> n;
	rep(i, n) {
		cin >> a >> b;
		x.push_back({ a,1 });
		x.push_back({ a + b,-1 });
	}

	sort(x.begin(), x.end());

	cnt = 0;
	rep(i, (x.size())-1) {
		cnt += x[i].second;
		ans[cnt] += ((x[i + 1].first) - (x[i].first));
	}

	rep(i, n - 1)cout << ans[i + 1] << " ";
	cout << ans[n] << endl;
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值