Codeforces Round 1009 (Div. 3)(部分题解)

补题链接 (这场是几何专题,但其实只是打着这个幌子,而大部分是思维之类的)

A. Draw a Square

思路:签到题,只要判断四个点是否一致就行了。

void solve()
{
    vector<int> a(4);
    int flag = 0;
    for (int i = 0; i < 4; i++){
        cin >> a[i];
        if (i>0){
            if (a[i] != a[i-1]) flag = 1;
        }
    }
    if (flag) cout << "No" << endl;
    else cout << "Yes" << endl;
}

B. The Third Side

思路:贪心,选的顺序不重要,比如选a,b就可以自己设定第三边为(a+b-1),因此就可以贪心的一次计算完,总和减去(n-1)就行了。

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    if (n == 1) {
        cout << a[0] << endl;
        return ;
    }
    int sum = accumulate(a.begin(), a.end(), 0)-n+1;
    cout << sum << endl;
}

C. XOR and Triangle

思路:这题我的话主要是靠观察和guess一下,实现观察,实现将其转换成二进制,发现不能只有一个1,和不能没有0,然后对于第一个1取1,对于第二个1取0,因为y要小于x,对于0取1.

vector<int> a;
bool cal(int x){
    int r1 = 0, r0 = 0;
    a.clear();
    ans = 0;
    while(x){
        int num = x%2;
        a.push_back(num);
        (num&1)? r1++ : r0++;
        x /= 2;
    }
    if (r1 == 1 || r0 == 0) return false;
    else return true;
}
void solve()
{
    int n, m, k;
    cin >> n;
    int f1 = 0, f0 = 0;
    ans = 0;
    if (!cal(n)){
        cout << -1 << endl;
        return ;
    }
    else {
        reverse(a.begin(), a.end());
        for (auto num : a){
            if (num&1) {
                // cout << ans << endl;
                if (!f1){
                    f1 = 1;
                    ans = ans*2;
                }
                else{
                    ans = ans*2+1;
                }
            }
            else {
                ans = ans*2+1;
            }
        }
        cout << ans << endl;
    }
    
}

D. Counting Points

思路:从每个圆的左端点枚举到右端点,根据勾股定理算它出的高H(即可取范围)存在map里取最大值,再统计一下:

struct node{
	int x, r;
};
void solve()
{
	int n, m;
	cin >> n >> m;
	vector<node> a(n);
	for (int i = 0; i < n; i++) cin >> a[i].x;
	for (int i = 0; i < n; i++) cin >> a[i].r;
	map<int, int> ma;
	for (auto [x, r]:a){
		for (int pos = x-r; pos<=x+r; pos++){
			int h = sqrt(r*r-(pos-x)*(pos-x));
			ma[pos] = max(ma[pos], h);
		}
	}
	int ans = 0;
	for (auto [x, h]:ma){
		ans += (2*(r+1)-1);
	}
	cout << ans << endl;
}

E. Empty Triangle

思路:不会交互题

 每次往里问一个三角形会能弄出很多空间,因为这道题没有hack所以很多人用随机数都能过。

void answer(int x, int y, int z) {
    cout << "! " << x << " " << y << " " << z << endl << flush;
}
int ask(int x, int y, int z) {
    cout << "? " << x << " " << y << " " << z << endl << flush;
    int r;
    cin >> r;
    if (r == 0) answer(x, y, z);
    return r;
}
 
void go() {
    int n;
    cin >> n;
    if (n == 3) {
        answer(1, 2, 3);
        return;
    }
    vector<int> a={1, 2, 3};
    while (true) {
        int r = ask(a[0], a[1], a[2]);
        if (r == 0) return;
        int x = 0, y = 1, z = 2;
        int r1 = ask(r, a[x], a[y]);
        if (r1 == 0) return;
        int r2 = ask(r, a[x], a[z]);
        if (r2 == 0) return;
        a = {r, r1, r2};
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wirepuller_king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值