首页 > 其他分享 >AtCoder_abc333

AtCoder_abc333

时间:2023-12-20 21:46:20浏览次数:42  
标签:AtCoder Contest int abc333 Limit mp

AtCoder_abc333

比赛链接

A - Three Threes

题目描述

输入一个 \(N\) 输出 \(N\) 个 \(N\) 。

解题思路

(这个题但凡学过都能写出来吧)

Code

// Problem: A - Three Threes
// Contest: AtCoder - Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
// URL: https://atcoder.jp/contests/abc333/tasks/abc333_a
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cout<<n;
	return 0;
}

B - Pentagon

题目描述

现在有一个正五边形 \(ABCDE\) ,给出两条对角线,请判断他们是否等长,如果相等输出 Yes 否则输出 No

解题思路

判断是否等长其实就是判断他们两端点在正五边形上相隔的点的数是否相等。

这样我们就想到了初版思路: if(abs(a[0]-a[1])==abs(b[0]-b[1]))cout<<"Yes";

但这样有一个问题,在这个代码中 \(AE\) 的长就变成了 \(4\) ,而我们希望他是 \(1\)。

显然,我们应该让他的长度变成 \(5-4=1\) ,由特殊到一般,对于正五边形上的任两点,我们都可以将 \(\min( \text{abs}(l-r),5 - \text{abs}(l-r))\) 定义为这两点之间的距离。

Code

// Problem: B - Pentagon
// Contest: AtCoder - Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
// URL: https://atcoder.jp/contests/abc333/tasks/abc333_b
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
string a,b;
int main(){
	cin>>a>>b;
	if(min(abs(a[0]-a[1]),5-abs(a[0]-a[1]))==min(abs(b[0]-b[1]),5-abs(b[0]-b[1])))
		cout<<"Yes";
	else
		cout<<"No";
	return 0;
}

C - Repunit Trio

题目描述

这里有一些被称为 Repunit 的、由 \(1\) 组成的数,就像 \(1,11,111,1111,11111,111111 \cdots \cdots\)。

现在给出一个数 \(N\) ,请输出第 \(N\) 小的、可以被分成三个 Repunit 的整数。

解题思路

首先观察数据范围,我们可以发现 \(N \le 333\) 而且样例数据也给出了当 \(N = 333\) 时,输出的整数为 \(112222222233\) ,那么我们就可以知道,在这 \(333\) 个数中,涉及到的,最大的 Repunit 为 \(111111111111\) ,那么,我们就可以枚举这 \(12\) 个 Repunit ,把所有可能涉及到的整数都枚举出来,枚举的细节就写在代码注释里了。

Code

// Problem: C - Repunit Trio
// Contest: AtCoder - Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
// URL: https://atcoder.jp/contests/abc333/tasks/abc333_c
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[15]={0,1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111};
//经典打表再放送
long long ans[10000],top;//记得开long long
int main(){
	cin>>n;
	for(int i=1;i<=12;i++)
		for(int j=1;j<=12;j++)
			for(int k=1;k<=12;k++)//枚举所有可能的三元组
				ans[++top]=a[i]+a[j]+a[k];//加起来
	sort(ans+1,ans+1+top);//枚举的时候不保证从小到大,所以记得先排序
	unique(ans+1,ans+1+top);//三重循环枚举只能保证不遗漏,不能保证不重复,所以要先进行去重
	cout<<ans[n];//因为已经进行了排序和去重,所以直接输出第N个就好了
	return 0;
}

D - Erase Leaves

题目描述

给出一颗有 \(N\) 个节点的树,每次操作都可以删除一个叶子节点[1]和与他连接的边,请问最少用几次可以删除 \(1\) 号节点?

解题思路

这道题实际上就是找出节点 \(1\) 的最大子树,然后用总节点数减去这个最大子树的节点数即可。

为什么?读题可知,可以被我们删除的节点只与一条边相连,也就是说,我们要保留 \(1\) 节点的一颗子树。

要使删除次数最少自然就是要让保留下的最多,那么保留下最大子树就好了。

Code

// Problem: D - Erase Leaves
// Contest: AtCoder - Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
// URL: https://atcoder.jp/contests/abc333/tasks/abc333_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
using namespace std;
struct edge{
	int u,v;
	int next;
}mp[30000005];//邻接表存树
int idx[30000005],top;
int n;
int ans=1;
int vis[300005];
void add(int u,int v){//加边
	mp[++top].u=u;
	mp[top].v=v;
	mp[top].next=idx[u];
	idx[u]=top;
}
int dfs(int k){//递归的判断每个子树的大小
	int ret=1;
	vis[k]=1;
	for(int i=idx[k];i!=0;i=mp[i].next)
		if(!vis[mp[i].v])
			ret+=dfs(mp[i].v);
	vis[k]=0;
	return ret;
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		int u,v;cin>>u>>v;
		add(u,v);
		add(v,u);//记得要建无向边!!!
	}
	int mad=0;//最大子树的大小
	vis[1]=1;//不能再返回来访问第一个点了
	for(int i=idx[1];i!=0;i=mp[i].next){//遍历每一棵树,因为要计算最大子树,所以不好放在递归里进行
		int t=dfs(mp[i].v);
		ans+=t;
		mad=max(mad,t);
	}
	cout<<ans-mad;//别忘了,ans初始值是1,因为删掉1节点本身也是1次操作
	return 0;
}

  1. 只与一条边相连的节点称为叶子节点 ↩︎

标签:AtCoder,Contest,int,abc333,Limit,mp
From: https://www.cnblogs.com/lmq742643/p/17917646.html

相关文章

  • AtCoder 333 A-D
    AThreeThrees(打表importjava.util.*;classMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();if(n==1)System.out.println(1);if(n==2)System.out.println......
  • AtCoder Beginner Contest 333
    B-Pentagon难度:⭐题目大意给定一个正五边形,其顶点为ABCDE;给定端点a,b,c,d;问a,b之间的距离和c,d之间的距离是否相等;解题思路两个端点之间的距离就看两个端点之间隔了几条边就行;并且因为是五边形,隔x条边和隔5-x条边是等价的;神秘代码#include<bits......
  • Atcoder ABC 333 题解(A - F)
    ABC不讲D待更E待更F设$f(i,j)$为有$i$个人时,第$j$个人活到最后的概率,显然:\[f(i,j)=\begin{cases}1,&i=1,j=1\\\frac{1}{2}f(i,i),&i\neq1,j=1\\\frac{1}{2}f(i,j-1)+\frac{1}{2}f(i-1,j-1),&i\neq1,2\lej......
  • AtCoder Beginner Contest 324
    C-ErrorCorrection大意是:给定一个字符串a,以及一组字符串,如果字符串与a满足以下之一即可我写的有点麻烦。。#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; cin>>n; strings; cin>>s; vector<int>ans; for(inti=1;i<=n;i++){ stringt; ci......
  • 【题解】AtCoder agc065_a Shuffle and mod K
    传送门:https://atcoder.jp/contests/agc065/tasks/agc065_a 为了方便理解,我们把要求的东西乘一个$-1$,再把答案序列倒过来;也就是说,我们现在要求$min_{A'}^{A'为A的排列}(\sum_{i=1}^{N-1}((A_{i+1}-A_{i})$$mod$$K))$比较显然的是,如果我们确定了答案序列的第一个数是多......
  • Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)
    ToyotaProgrammingContest2023#8(AtCoderBeginnerContest333)A-ThreeThrees代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e6+10;typedefpair<ll,ll>pii;#definefifirst#definesesecondvoid......
  • 题解 ABC333F【Bomb Game 2】
    来个可能有点麻烦但不用动脑子的暴力做法。直接设\(f_{i,j}\)表示有\(i\)个人时,第\(j\)个人幸存的概率。显然有\(f_{1,1}=1\)。对于\(i>1\),分类讨论容易得到:\[f_{i,j}=\begin{cases}\frac{f_{i,n}}{2},&j=1\\\frac{f_{i-1,j-1}+f_{i,j-1}}{2},&1<j\lei\\\e......
  • AtCoder Beginner Contest 325
    C-Sensors但看数据发现是经典油田问题,直接dfs#include<bits/stdc++.h>usingnamespacestd;intn,m;intdx[8]={-1,-1,-1,0,1,1,1,0};intdy[8]={-1,0,1,1,1,0,-1,-1};intvis[1005][1005];charmp[1005][1005];voiddfs(intx,inty){ vis[x][y]=......
  • AtCoder Beginner Contest 332
    C-T-shirts题意是:给定一个string,字符代表每天有不同的事,做不同的事会穿不同的衣服,问你最少需要准备多少T恤。思路:贪心,能不用T恤就不要T恤#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn,k; cin>>n>>k; strings; cin>>s; intans=0; intcnt=k; i......
  • AT_abc333_e [ABC333E] Takahashi Quest 题解
    AT_abc333_e[ABC333E]TakahashiQuest题解思路解析可以发现一瓶药水无论什么时候拿被使用掉的时间都是不会变的,所以如果我们想让一瓶药水再背包里待得时间尽可能的短就要让它尽可能的被晚拿起来,于是我们就可以想到使用栈存下每一瓶同类的药水分别出现的时间,此时每遇到一只怪......