首页 > 其他分享 >AtCoder Beginner Contest 385 Solution

AtCoder Beginner Contest 385 Solution

时间:2024-12-21 22:34:32浏览次数:3  
标签:AtCoder int auto Solution nx ny 385 dx dy

A - Equally (abc385 A)

题目大意

给定三个数,问能不能分成两个以上的组,使其和相同。

解题思路

两个以上的组要么是两组要么是三组,三组就是三个数都相等,两组就是两个小的加起来等于大的。

代码

void solve()
{
    int a[10];
    cin >> a[0] >> a[1] >> a[2];
    sort(a, a + 3);
    if ((a[0] == a[1] && a[1] == a[2]) || (a[0] + a[1] == a[2]))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}

B - Santa Claus 1 (abc385 B)

题目大意

给定一个二维地图,#是墙,.是空地,@是房间。

给定起点和每一步的操作序列,如果可以走就走,如果撞墙了就原地不动,问最后的位置和一共经过了几个房间,经过相同的房间只算一次。

解题思路

按照题意模拟即可

代码

void solve()
{
    string s[104];
    int h, w, x, y;
    cin >> h >> w >> x >> y;
    for(int i=0;i<h;i++) cin >> s[i];
    map<char, int> dx, dy;
    dx['U'] = -1, dx['D'] = 1, dx['L'] = 0, dx['R'] = 0;
    dy['U'] = 0, dy['D'] = 0, dy['L'] = -1, dy['R'] = 1;
    string t;
    cin >> t;
    int ans = 0;
    for(auto i : t) {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx < 1 || nx > h || ny < 1 || ny > w || s[nx - 1][ny - 1] == '#') {
            continue;
        }
        if (s[nx - 1][ny - 1] == '@') {
            ans++;
            s[nx - 1][ny - 1] = '.';
        }
        x = nx, y = ny;
    }
    cout << x << " " << y << " " << ans;
}

C - Illuminate Buildings (abc385 C)

题目大意

给定一个数组,问最多选几个位置,使这几个位置的数相同,并且位置之间间隔相同。

解题思路

枚举,首先枚举间隔,然后枚举起点(起点的范围在间隔以内),然后从起点向后遍历,就是在求最长的一段相同的数字有多长,那么记录一个长度,如果当前数字和上一个相同就加一,否则清空,然后每次都更新一下ans即可。

代码

void solve()
{
    int n;
    cin >> n;
    vi a(n);
    rep(i, n) cin >> a[i];
    int tmp = 1;
    for (int k = 1;k < n;k++) {
        for (int i = 0;i < k;i++) {
            int lst = 1;
            for (int j = i + k;j < n;j += k) {
                if (a[j] == a[j - k]) lst++;
                else lst = 1;
                tmp = max(tmp, lst);
            }
        }
    }
    cout << tmp;
}

D - Santa Claus 2 (abc385 D)

题目大意

与第二题类似,但没有墙壁。

一共给定N个房间的坐标,以及M条指令,每条指令是向上下左右某个方向前进C步,问最后的坐标以及经过了多少个房间,重复的房间依然只算一个。

解题思路

用两个map套set,记录某个x坐标内有哪些房间和某个y坐标内有哪些房间。

那么分两种情况,一种是上下走,那么他会删除当前x坐标内的连续一段y坐标的房间,在这个x坐标的set内upperbound和lowerbound出这一段y坐标的范围,然后在两个map中删掉这些走过的房间就可以了。

代码

#define int long long
#define rep(i,n) for(int i=0;i<(int)(n);i++)
void solve()
{
    int n, m;
    int sx, sy;
    cin >> n >> m >> sx >> sy;
    map<int, set<int> > mx, my;
    rep(i, n) {
        int x, y;
        cin >> x >> y;
        mx[x].insert(y);
        my[y].insert(x);
    }
    map<char, int> dx, dy;
    dx['U'] = 0, dx['D'] = 0, dx['L'] = -1, dx['R'] = 1;
    dy['U'] = 1, dy['D'] = -1, dy['L'] = 0, dy['R'] = 0;
    int x = sx, y = sy;
    rep(tt, m) {
        char d;
        int c;
        cin >> d >> c;
        int nx = x + dx[d] * c;
        int ny = y + dy[d] * c;
        if (d == 'U' || d == 'D') {
            if (!mx.count(nx)) {
                x = nx;
                y = ny;
                continue;
            }
            int st = y, ed = ny;
            if (st > ed) swap(st, ed);
            auto l = mx[nx].lower_bound(st);
            auto r = mx[nx].upper_bound(ed);
            if (r == mx[nx].begin()) {
                x = nx;
                y = ny;
                continue;
            }
            vi v;
            for (auto i = l; i != r; i++) {
                v.pb(*i);
            }
            for (auto i : v) {
                mx[x].erase(i);
                if (my.count(i)) my[i].erase(nx);
            }
        }
        if (d == 'L' || d == 'R') {
            if (!my.count(ny)) {
                x = nx;
                y = ny;
                continue;
            }
            int st = x, ed = nx;
            if (st > ed) swap(st, ed);
            auto l = my[ny].lower_bound(st);
            auto r = my[ny].upper_bound(ed);
            if (r == my[ny].begin()) {
                x = nx;
                y = ny;
                continue;
            }
            vi v;
            for (auto i = l; i != r; i++) {
                v.pb(*i);
            }
            for (auto i : v) {
                my[y].erase(i);
                if (mx.count(i)) mx[i].erase(ny);
            }
        }
        x = nx;
        y = ny;
    }
    int sum = 0;
    for (auto i : mx) sum += i.second.size();
    cout << x << " " << y << " " << n - sum;
}

E - Snowflake Tree (abc385 E)

题目大意

一个雪花图的生成是选定一个x和y,首先在一个点上连x个点,然后在这x个点上连y个叶子。

现在给定一棵树,问最多删除多少个点可以将其变成一个雪花图。

解题思路

反过来想就是找一颗最大的雪花图,我们枚举每一个点作为雪花图的根,然后肯定是要数一下儿子都有多少孙子,先把这个存进一个数组里,那么现在问题就是求可以使数组里的某个数减一,减到0数就会消失,问每个数相同的情况下最大的和是多少。

不难想到最后每个数相同肯定也是等于其中某个数,就是有一个数是不动的,比该数大的-1,比该数小的直接删除,那么就可以排个序,枚举这个数是谁,然后直接乘出来了。

代码

#define N 300010
int n,ans=0;
vector<int> vt[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		x--,y--;
		vt[x].push_back(y);
		vt[y].push_back(x);
	}
	for(int i=0;i<n;i++){
		vector<int> seq;
		for(auto x:vt[i]) seq.push_back(vt[x].size()-1);
		sort(seq.begin(),seq.end());
		reverse(seq.begin(),seq.end());
		for(int j=0;j<seq.size();j++) if(seq[j]) ans=max(ans,(j+1)*(seq[j]+1)+1);
	}
	printf("%d\n",n-ans);
	return 0;
}

标签:AtCoder,int,auto,Solution,nx,ny,385,dx,dy
From: https://www.cnblogs.com/NightRaven/p/18621471

相关文章

  • Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)D题
    D-RepeatedSequence 思路:先存储数组的前缀和,把周期的和剪掉,这样就只需要查找在一个周期是否满足,枚举1-n,毕竟不确定周期是从哪开始的,对于从当前数为起始的周期,当剩余的数res小于从当前i为起点的i后缀和时,我们只需要查找一个R 满足b[r]-b[i-1]区间和等于res,若最后查......
  • Solution - Luogu P11393 [JOI Open 2019] 送金
    下标默认是在\(\bmod\n\)意义下的。考虑到如果\(a_i>b_i\)那么不可能只操作\(a_{i-1}\)使得\(a_i\)合法,因为这只增不减。于是这说明当\(a_i>b_i\)时一定会操作\(a_i\)使得\(a_i\leb_i\)。但是同时如果\(b_i-a_i\)太大了,\(a_{i-1}\)就不一定能操作......
  • Solution - Atcoder ARC189E Straight Path
    首先发现的是\(n=2,3\)必定无解。接下来考虑\(n\ge4\)的情况。首先手玩一下小数据\(n=4\)。因为此时对应的图为一个带对角线的正方形,于是可以从对称的角度入手,得到\(\max=3\)的解:\(\begin{matrix}1&{\color{red}{-}}&2\\{\color{blue}{|}}&{\color{gree......
  • atcoder 杂题 #04
    atcoder杂题#04abc126_fXORMatchingarc081_dFlipandRectanglesarc080_cYoungMaidsabc383_gBarCoverabc126_f挺有意思的一道题,让我猜到结论了。由于长度是值域的两倍,所以不难想到每个数出现两次,不然发现对于\(a_i=a_j=a_k\)的三个数,当\(a_i\oplus\cdots\op......
  • Document Solutions for Word CRACK
    DocumentSolutionsforWordCRACKDocumentSolutionsforWordv8addsenhancedfieldsupportforautomation,cross-referencing,formatting,andcreatingtablesofcontents.DocumentSolutionsforWord(DsWord)byMESCIUSisapowerful.NETlibr......
  • AtCoder DP Practice
    众所周知,AtCoder有一场极educational的DPContest。A裸的线性DP,设\(dp_i\)表示跳到第\(i\)个格子的最小费用,显然有转移:\[dp_{i}=\min(dp_{i-1}+|h_i-h_{i-1}|,dp_{i-2}+|h_i-h_{i-2}|)\]边界为\(dp_1=0,dp_2=|h_2-h_1|\)。B裸的线性DP......
  • Document Solutions for Excel crack
    DocumentSolutionsforExcelcrackDocumentSolutionsforExcelv8.0.0introducesprogrammaticsupportforwhat-ifanalysiswithscenarios,elevatingdecision-makinginExcel.DocumentSolutionsforExcelbyMESCIUSisacomprehensivetooldesi......
  • [题解]AtCoder Beginner Contest 383(ABC383) A~F
    A-aaaadaa按题意模拟即可。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn;charc1,c2;strings;signedmain(){ cin>>n>>c1>>c2>>s; for(inti:s){ if(i==c1)cout<<c1; elsecout<<c2; } return0;}B-......
  • AtCoder Beginner Contest 384 Solution
    A-aaaadaa(abc384A)题目大意给个长度为n的字符串,以及两个字母a和b,要求把字符串中不是a的字符全部都变成b。解题思路一个循环判断一下就行了。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;chara,b;cin>>n>>a>>b;st......
  • AtCoder Beginner Contest 383
    省流版A.模拟加水漏水即可B.枚举两个加湿器的位置,然后统计加湿的单元格数量即可C.从每个加湿器进行\(BFS\)即可D.考虑因子个数的计算,分情况枚举质因数即可E.考虑\(f\)函数的求法,从小到大加边,考虑每条边对答案的贡献即可F.对颜色排序,在\(01\)背包的基础上,新增一个......