首页 > 其他分享 >Educational Codeforces Round 1

Educational Codeforces Round 1

时间:2023-04-29 17:56:08浏览次数:50  
标签:Educational ch cout int fy cin Codeforces fx Round

A. Tricky Sum

公式求出1 到 n的和,然后枚举二等整次幂。

#include <bits/stdc++.h>

using namespace std;

#define int long long

void solve(){
    int n; cin >> n;
    int sum = ( 1 + n ) * n  / 2;
    for( int i = 1 ; i <= n ; i <<= 1 )
        sum -= i * 2;
    cout << sum << "\n";
    return ;
}

int32_t main(){
	int t ;
    cin >> t;
    while( t -- )
        solve();
}

B. Queries on a String

每移动\(r-l+1\)就相当没有移动,移动\(k\)次等价于移动\(k\mod (r-l+1)\)次

#include <bits/stdc++.h>

using namespace std;

#define int long long

int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    string s, t;
    cin >> s;
    int m;
    cin >> m;
    for (int l, r, k; m; m--) {
        cin >> l >> r >> k;
        k %= (r - l + 1);
        s = s.substr( 0 , l-1 )+s.substr( r - k , k )+s.substr( l-1 , r-l+1-k )+s.substr(r);
    }
    cout << s << "\n";
}

C. Nearest vectors

atan2(y,x)计算的值是$\arctan \frac y x \(的值,注意的是,`atan`的值域是\)[0,\pi]\(,而`atan2`的值域是\)[-\pi,\pi]$

我们用atan2计算出每个向量与\(x\)轴的夹角,然后排序,计算相邻的两个向量的角度即可

#include <bits/stdc++.h>

using namespace std;

#define double long double

typedef pair<double, int> pdi;

const double PI = acos(-1);


int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n;
    cin >> n;
    vector<pdi> a;
    for (double i = 1, x, y; i <= n; i++) {
        cin >> x >> y;
        a.emplace_back(atan2(x, y), i);
    }
    sort(a.begin(), a.end());
    auto tmp = [=](int x, int y) {
        double t = a[x].first - a[y].first;
        if (t < 0) t += PI * 2;
        return t;
    };

    double ans = tmp(0, n - 1);
    int l = a[0].second, r = a[n - 1].second;
    for (int i = 1; i < n; i++) {
        if (tmp(i, i - 1) < ans)
            ans = tmp(i, i - 1), l = a[i].second, r = a[i - 1].second;
    }
    cout << l << " " << r;
    return 0;
}

D. Igor In the Museum

.表示空地,*表示墙,空地相连可以组成联通块,每次给一点,问该点所属联通块与多少面墙所相邻。

注意*表示的是四面墙,所以每一个方向过来的都要统计上。

这道题直接 bfs,然后给联通块打标记即可

#include<bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    array dx = {0, 0, 1, -1}, dy = {1, -1, 0, 0};
    int n, m, k;
    cin >> n >> m >> k;
    vector<string> g(n);
    for (auto &i: g) cin >> i;
    vector<int> ans;
    vector<vector<int>> vis(n, vector<int>(m, -1));

    for (int r, c , tag; k; k--) {
        cin >> r >> c, r--, c--;
        if (vis[r][c] != -1) {
            cout << ans[vis[r][c]] << "\n";
            continue;
        }
        tag = ans.size() , ans.push_back(0) , vis[r][c] = tag;
        queue<pair<int, int>> q;
        q.emplace(r, c);
        while (!q.empty()) {
            auto [x, y] = q.front();
            q.pop();
            for (int fx, fy, i = 0; i < 4; i++) {
                fx = x + dx[i], fy = y + dy[i];
                if (fx < 0 || fy < 0 || fx >= n || fy >= m || vis[fx][fy] != -1 ) continue;
                if( g[fx][fy] == '.' ) vis[fx][fy] = tag , q.emplace( fx , fy );
                else ans[tag] ++;
            }
        }
        cout << ans[tag] << "\n";
    }
    return 0;
}

E. Chocolate Bar

f[i][j][k]表示i*j的巧克力吃 k 块的最小花费。

因为是数据范围极小,直接枚举切的方向和位置,以及切好的两块分别吃几块即可。

#include<bits/stdc++.h>

using namespace std;

const int N = 35, K = 55;

int f[N][N][K];

int read() {
    int x = 0, f = 1, ch = getchar();
    while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
    if (ch == '-') f = -1, ch = getchar();
    while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
    return x * f;
}

int dfs(int n, int m, int k) {
    if (f[n][m][k] != -1) return f[n][m][k];
    if (n * m == k || k == 0) return f[n][m][k] = 0;
    int ans = INT_MAX;
    for (int a = 0, b = k; a <= k; a++ , b --) {
        for (int i = 1, j = n - 1; i <= j; i++, j--) {
            if (i * m < a || j * m < b) continue;
            ans = min(ans, m * m  + dfs(i, m, a) + dfs(j, m, b));
        }
        for (int i = 1, j = m - 1; i <= j; i++, j--) {
            if (n * i < a || n * j < b) continue;
            ans = min(ans, n * n + dfs(n, i, a) + dfs(n, j, b));
        }
    }
    return f[n][m][k] = ans;
}

void solve() {
    int n = read(), m = read(), k = read();
    printf("%d\n", dfs(n, m, k));
    return;
}

int main() {
    fill(f[0][0], f[N - 1][N - 1] + K, -1);
    for (int t = read(); t; t--)
        solve();
    return 0;
}

标签:Educational,ch,cout,int,fy,cin,Codeforces,fx,Round
From: https://www.cnblogs.com/PHarr/p/17364305.html

相关文章

  • Educational Codeforces Round 145 (Rated for Div. 2)
    Preface补题A~D都能秒出,E没看出性质被薄纱了,F感觉是个丁真题随便讨论下就过了后面看了下F的标算是个倍增,感觉Tutorial对性质挖掘的还不够的说A.GarlandSB题,设出现次数最多的颜色个数为\(cm\),若\(cm\le2\)则答案为\(4\);若\(cm=3\)则答案为\(6\),若\(cm=4\)则无解importjav......
  • CodeForces-858#C 题解
    正文♦最坏时间复杂度:\(\mathcal{O}(\lvertS\rvert)\)本题十分简单,但请注意两个条件要同时满足。因为要求分割的次数越少越好,所以只要连续的辅音字母长度不大于2就不需要分割。由于辅音字母太多,只需要标记元音字母即可。#include<iostream>#include<string>#include<cst......
  • Codeforces Round 854 补题总结
    CodeforcesRound854补题总结前言昨天做这套题很不顺,今天补完题大概总结一下。总结RecentActions按题意模拟即可,考虑到前\(n\)个数一定始终在后\(m\)个数的前面,所以说当当前队列中如果没有出现\(x\)而在第\(i\)轮放进了\(x\),那么当前在队首的编号小于\(n\)的数......
  • Codeforces Round 868 Div 2
    A.A-characteristic(CF1823A)题目大意要求构造一个仅包含\(1\)和\(-1\)的长度为\(n\)的数组\(a\),使得存在\(k\)个下标对\((i,j),i<j\)满足\(a_i\timesa_j=1\)。解题思路当有\(x\)个\(1\),\(y\)个\(-1\)时,其满足条件的下标对数量为\(\frac{x(x-1)}{2}......
  • Codeforces Round 868 (Div. 2)
    Preface恭迎废物hl666终于回到了他忠诚的蓝名之位本来这场25min切完前三题而且没挂的时候感觉状态不错的,然后D被自己的一个假做法坑了1h最后ztc想出了大概的构造方法后已经来不及写了,一些细节没考虑好直接爆炸本来当时就有弃D开E的想法的,但可以E的题意在公告出来之前就已经读......
  • Codeforces Round 868 (Div. 2) A-E题解
    比赛地址这把真不在状态,麻了,看来还得再练A.A-characteristic题意:给出n和k,要求构造只含1和-1数组a,存在k对(i,j)(i≠j),有a[i]*a[j]=1Solution令构造的数组有x个1和y个-1,那么其对于答案的贡献有\[x*(x-1)/2+y*(y-1)/2\]又因为有x+y=n,所以可以转化成关于x的一元二次方程化简后......
  • BigDecimal的setScale常用方法(ROUND_UP、ROUND_DOWN、ROUND_HALF_UP、ROUND_HALF_DOW
    BigDecimal的setScale四大常用方法总结//设置小数点后第三位数字一大一小观察效果BigDecimalnum=newBigDecimal("3.3235667");BigDecimalnumOne=newBigDecimal("3.3275667");1、ROUND_UP:进位制:不管保留数字后面是大是小(0除外)都会进1//ROUND_UP--进位制:不管保留数......
  • 论文阅读笔记《Grounded Action Transformation for Robot Learning in Simulation》
    GroundedActionTransformationforRobotLearninginSimulation发表于AAAI2017仿真机器人学习中的接地动作变换HannaJ,StoneP.Groundedactiontransformationforrobotlearninginsimulation[C]//ProceedingsoftheAAAIConferenceonArtificialIntelligence......
  • 论文阅读笔记《Stochastic Grounded Action Transformation for Robot Learning in Si
    StochasticGroundedActionTransformationforRobotLearninginSimulation发表于IROS2020(CCFC)模拟中机器人学习的随机接地动作转换DesaiS,KarnanH,HannaJP,etal.Stochasticgroundedactiontransformationforrobotlearninginsimulation[C]//2020IEEE......
  • Codeforces Round 867 (Div. 3)(A~D)
    目录A.TubeTubeFeed题意思路代码B.KarinaandArray题意思路代码C.BunLover题意思路代码D.Super-Permutation题意思路代码A.TubeTubeFeed题意给定时间\(t\),每个视频有一个价值\(b_i\),观看一个视频需要\(a_i\)秒,跳过一个视频需要花费\(1s\),求能观看完的价值最大......