2024-12-12【Panasonic Programming Contest 2024(AtCoder Beginner Contest 231)】【题解A-G】

D - Neighbors

================================================================================

题目大意


在这里插入图片描述

确定是否有办法将编号为 1 到 N 的 N 人并排排成一行,以满足以下格式中的所有 M 个条件。条件: A i A_i Ai​和 B i B_i Bi​是相邻的。

code:


#include<bits/stdc++.h>

#include<atcoder/all>

#define fi first

#define se second

#define eb emplace_back

using namespace std;

using namespace atcoder;

using ll = long long;

int main() {

int N, M; cin >> N >> M;

vector cnt(N);

dsu d(N); //并查集

for (int i = 0; i < M; ++i) {

int a, b; cin >> a >> b; --a; --b;

++cnt[a];

++cnt[b];

if (cnt[a] > 2 || cnt[b] > 2 || d.same(a, b)) {

cout << “No” << endl;

return 0;

}

d.merge(a, b);

}

cout << “Yes” << endl;

return 0;

}

#include<bits/stdc++.h>

using namespace std;

int n,m,tot=0,qwq=0;

int f[1000005];

int pre[1000005];//并查集

int Find(int x){

if(pre[x]!=x) pre[x]=Find(pre[x]);

return pre[x];

}

int main(){

cin>>n>>m;

for(int i=1;i<=n;i++) pre[i]=i;//初始化

for(int i=1,x,y;i<=m;i++){

scanf(“%d%d”,&x,&y);

int fx=Find(x),fy=Find(y);

if(fx==fy) return printf(“No”),0;

pre[fx]=fy;

f[x]++,f[y]++;

}

for(int i=1;i<=n;i++){

if(f[i]>2) return printf(“No”),0;

}

printf(“Yes”);

return 0;

}

E - Minimal payments

=======================================================================================

题目大意


在这里插入图片描述

仅使用这些硬币支付价值 X 日元的产品时,用于付款并作为找零退回的硬币的最少总数是多少?

准确地说,当 Y 是至少为 X 的整数时,求精确表示 Y 日元所需的硬币数量和精确表示 Y-X 日元所需的硬币数量的最小总和。

code:


#include “bits/stdc++.h”

using namespace std;

typedef long long ll;

int n;

vector a;

map<pair<ll,int>,ll> mp;

ll solve(ll x, int k) {

if (mp.find({x,k}) != mp.end()) return mp[{x,k}];

cerr << x << " " << k << endl;

if (k == n-1) return mp[{x,k}] = x;

ll b = a[k+1]/a[k];

return mp[{x,k}] = min(solve(x/b,k+1)+x%b,solve(x/b+1,k+1)+b-x%b);

}

int main() {

ll x;cin >> n >> x;

a.resize(n);

for (int i = 0; i < n; i++) {

cin >> a[i];

}

cout << solve(x,0) << endl;

return 0;

}

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll inf = 1e18 + 10;

const int maxl = 105;

ll x;

ll c[maxl], n, a[maxl], d[maxl];

ll f[maxl][2];

int main() {

cin >> n >> x;

for (int i = n; i >= 1; i–) {

cin >> a[i];

}

for (int i = 1; i <= n; i++) {

d[i] = x / a[i];

x %= a[i];

}

for (int i = 1; i <= n; i++) {

if (i == 1) {

f[i][0] = d[i];

f[i][1] = d[i] + 1;

} else {

ll k = a[i-1] / a[i];

f[i][0] = d[i] + f[i-1][0];

f[i][0] = min(f[i][0], k - d[i] + f[i-1][1]);

f[i][1] = d[i] + 1 + f[i-1][0];

f[i][1] = min(f[i][1], k - d[i] - 1 + f[i-1][1]);

}

}

cout << f[n][0] << endl;

return 0;

}

F - Jealous Two

==================================================================================

题目大意


在这里插入图片描述

Snuke 计划给高桥和青木各送一件礼物。

礼物有 N 个候选人。 高桥对第 i 个候选人的印象是 A i A_i Ai​ ,青木对第 i 个候选人的印象是 B i B_i Bi​

两人非常嫉妒。 如果高桥对青木收到的礼物的印象大于高桥对高桥收到的礼物的印象,高桥就会嫉妒青木并开始打架,反之亦然。

在 N 2 N^2 N2 种可能的送礼方式中,有多少不会导致战斗?

code:


#include<bits/stdc++.h>

#define SZ 200005

using namespace std;

typedef long long ll;

typedef pair<int, int> pii;

int tree[SZ];

void add(int pos, int val) {

++pos;

while (pos < SZ) {

tree[pos] += val;

pos += (pos&-pos);

}

}

int sum(int pos) {

++pos;

int ret = 0;

while (pos > 0) {

ret += tree[pos];

pos &= (pos-1);

}

return ret;

}

int main() {

ios_base::sync_with_stdio(false);

cin.tie(nullptr);

int N;

cin >> N;

vector v(N);

for (auto& e : v) {

cin >> e.first;

}

vector coor;

for (auto& e : v) {

int x;

cin >> x;

e.second = x;

coor.push_back(x);

}

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

for (auto& e : v) {

e.second = coor.begin()-lower_bound(coor.begin(), coor.end(), e.second);

}

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

long long ans = N;

int prev = -100;

int prevx = -100;

int accu = 1;

for (auto& e : v) {

int a = e.first;

int x = -e.second;

if (a == prev && x == prevx) {

ans += sum(SZ-1)-sum(x-1) + accu;

accu++;

} else {

accu = 1;

ans += sum(SZ-1)-sum(x-1);

}

add(x,1);

prev = a;

prevx = x;

}

cout << ans << ‘\n’;

return 0;

}

G - Balls in Boxes

=====================================================================================

题目大意


在这里插入图片描述

code:


#include <bits/stdc++.h>

using namespace std;

const long long MOD=998244353;

long long dp[1001];

long long f(long long x, long long n){

if(n==0) return 1LL;

if(n&1) return x*f(x,n-1)%MOD;

long long h=f(x,n/2);

return h*h%MOD;

}

int main(){

ios_base::sync_with_stdio(false);

cin.tie(nullptr);

int n;

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image
ptr);

int n;

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

[外链图片转存中…(img-Rsq4FcnI-1721129086057)]

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

[外链图片转存中…(img-e5c3w0mz-1721129086058)]

2、Redis学习笔记及学习思维脑图

[外链图片转存中…(img-c7JtZUYa-1721129086058)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-qOJyFJhZ-1721129086058)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值