补题报告3

news/2024/10/3 18:23:31

背景

2024-10-3上午打的比赛(CSP-J模拟2),作赛后总结报告。


IP地址(\(ip\)

赛时AC。

概述

每个设备有一个对应的\(IP\),先给出对应的设备与\(IP\),再给出几个\(IP\),求对应的设备。

思路

\(map\) 存储,映射

我的代码
代码(点左边三角展开)
#include <map>
#include <cstdio>
#include <iostream>
using namespace std;
int n,q;
map <string,string> mp;
int main() {
//	freopen("ip.in","r",stdin);
//	freopen("ip.out","w",stdout);scanf("%d",&n);for(int i=1; i<=n; ++i) {string a,b;cin >> a >> b;mp[b] = a;}scanf("%d",&q);for(int i=1; i<=q; ++i) {string b;cin >> b;cout << mp[b] << "\n";}
//	fclose(stdin);
//	fclose(stdout);return 0;
}

是否同构(\(same\)

概述

同构数组:两个数组(\(a\),\(b\)) , 在\(b\)数组不变情况下,将\(a\)数组的前\(k\)项与后\(k\)项交换,能得到\(a=b\)
给出两数组,判断是否为同构数组

我的代码

Code(错)
#include <cstdio>
using namespace std;
const int maxn = 1e6+555;
int t;
int a[maxn];
int b[maxn];
int main() {
//	freopen("same.in","r",stdin);
//	freopen("same.out","w",stdout);scanf("%d",&t);while(t--) {int n;scanf("%d",&n);for(int i=1; i<=n; ++i) scanf("%d",&a[i]);for(int i=1; i<=n; ++i) scanf("%d",&b[i]);bool flag = 0;for(int i=1; i<=n; ++i) {if(a[i] != b[n-i+1] || a[n-i+1] != b[i])for(int j=i; j<=n-i+1; ++j)if(a[j] != b[j] || a[n-j+1] != b[n-j+1]) {flag = 1;break;}if(flag) break;}if(flag) printf("No\n");else printf("Yes\n");}
//	fclose(stdin);
//	fclose(stdout);return 0;
}

喜得10分

错因

题目描述 : \(swap(a_1,a_{N−k+1}),⋯,swap(a_k,a_N))\)
我的代码 : \(swap(a_1,a_N),⋯,swap(a_k,a_{N−k+1}))\)
QvQ

正解

  • 开局判断,若完全一致,直接通过

  • 不行,找\(a_i = b_1\),并用\(pos\)记录\(i\)

  • 再将\(pos\)前后交换,然后再判断是否一致

正解代码

Code(对)
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 1e6+1111;int t;
int a[maxn];
int b[maxn];
int n;
bool Check() {for(int i=1; i<=n; ++i)if(a[i] != b[i]) return 0;return 1;
}int main() {cin >> t;while(t--) {cin >> n;for(int i=1; i<=n; ++i) scanf("%d",&a[i]);for(int i=1; i<=n; ++i) scanf("%d",&b[i]);if(Check()) {//完全一致直接通过 printf("Yes\n");continue;}int pos;for(pos=n/2+1;pos<=n; ++pos) if(a[pos] == b[1]) break;//找到和b数组头一样的 for(int i=pos;i<=n;++i)//翻转a数组 swap(a[i],a[i-pos+1]);if(Check()) cout << "Yes\n";//二轮判断 else cout << "No\n";}return 0;
}

箱子(\(box\))

10分 (不嘻嘻

概述

\(n\)个箱子重量,每次最多能合并\(m\)
合并后的大箱子重量花费的体力都为合并的箱子重量之和
求最后合并完,花费最少多少体力?

思路(我的)

每次都排序,合并掉最小的\(m\)个,直到剩一个。

爆 炸

代码

Code
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn =1e5+111;
int cnt;//0的个数 
int n,m;
long long ans;
long long a[maxn];
signed main(){
//	freopen("box.in","r",stdin);
//	freopen("box.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;++i) scanf("%lld",&a[i]);while(cnt < n-1){sort(a+cnt+1,a+n+1);long long h=0;//合并的几个箱子的重量和for(int i=1;i<=m;++i){h+=a[cnt+i];a[cnt+i] = 0; } a[cnt+m] = h;ans += h;cnt += m-1;}printf("%lld",ans);
//	fclose(stdin);
//	fclose(stdout); return 0;
}

正解

使用优先队列(priority_queue)装一手

代码

Code(对)
#include <queue>
#include <iostream>
typedef long long ll;
using namespace std;ll sum;
int n,m; 
priority_queue<ll,vector<ll>,greater<ll> > q;
signed main(){cin >> n >> m;for(int i=1;i<=n;++i){int x;cin >> x;q.push(x); }if((n-1) % (m-1) > 0){//抛去第n个人,剩余的是不是(m-1)的倍数,最后+第n个人正好是m的倍数int cnt = (m-1) - (n-1) % (m-1);while(cnt--) q.push(0);//最后不足的要补0 }while(!q.empty()){ll h=0;bool flag=0;for(int i=1;i<=m;++i){if(!q.empty()){h += q.top();q.pop();}else{flag = 1;break;}}if(flag) break;q.push(h);sum += h;}return 0;
}

社恐的聚会(\(party\))

概述

\(n\)个人,要参加聚会,但是很社恐,所以都想跟互相认识的人坐一张桌。
有两张桌 (寒酸),问能否将这些人安排好?
如果行,人多的那张桌最少有几人?

思路

骗分,40 (喜

40分
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn = 514;
int n;
int k;
int cnt; 
bool g[maxn][maxn];
int main() {
//	freopen("party.in","r",stdin);
//	freopen("party.out","w",stdout); scanf("%d",&n);for(int i=1; i<=n; ++i) {for(int j=1; j<=n; ++j) {scanf("%d",&g[i][j]);}}if(n <= 2) printf("Yes\n1");else if(n == 3){bool flag = 0;if(g[1][2] == 1 && g[2][1] == 1) flag = 1;if(g[1][3] == 1 && g[3][1] == 1) flag = 1;if(g[2][3] == 1 && g[3][2] == 1) flag = 1;if(flag) printf("Yes\n2");else printf("No\n"); }else {for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){if(g[i][j] == 0) ++k;if(g[i][j] && g[j][i]) ++cnt;}}if(k == n*n || cnt <= 1) printf("No\n");else {int ans;if(n%2==1) ans = n/2+1;else ans = n/2;printf("Yes\n%d",ans);}}
//	fclose(stdin);
//	fclose(stdout);return 0;
}

正解

二分图+\(DFS\)+\(DP\), 无敌了
没啥好说的(其实是不会)
好吧,说两句:
将不是互相认识的人建边,对所有连通块进行判断当前连通块是否为二分图,不是直接结束(输出\(No\)),是,记录各连通块中黑白点数量,然后做超级无敌\(DP\)求解

注意,黑点和白点本质上没有区别,每个连通块都可以黑白互换

\(DP\)事项:

  1. \(dp_{i,j,0}\)表示前\(i\)个连通块,
    是否能塞入\(j\)个点到第一张桌子(白点)
  2. \(dp_{i,j,1}\)表示前\(i\)个连通块,
    是否能塞入\(j\)个点到第二张桌子(黑点)
超级无敌代码(这次真无敌了)
#include <iostream>
using namespace std;
const int maxn = 522;int n,g[maxn][maxn];
bool vis[maxn];
int color[maxn];//黑白
int m[maxn][2],h;//每个连通块黑白颜色数量
int head[maxn],next[maxn * maxn] ,to[maxn * maxn],cnt;
bool f[maxn][maxn][2];//DPvoid Insert(int u,int v) {next[++cnt] = head[u];head[u] = cnt;to[cnt] = v;
}bool dfs(int u,int c) { //u是当前点,c是颜色vis[u] = 1;color[u] = c;m[h][c]++;for(int i=head[u]; i; i=next[i]) { // 遍历int v = to[i];if(vis[v])if(color[u] == color[v]) return 0;else if(!dfs(v,c^1)) return 0;//0^1=1,1^1=0,c^1是取反}return 1;
}int main() {cin >> n;for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)cin >> g[i][j];for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)//如果不是互相认识if(!(g[i][j] && g[j][i])) {Insert(i,j);Insert(j,i);}for(int i=1; i<=n; ++i) {if(vis[i]) continue;++h;//连通块数if(!dfs(i,0)) {cout << "No\n";return 0;w}}dp[0][0][0] = 1;dp[0][0][1] = 1;int maxx = n/2;for(int i=1; i<=maxx; ++i) {for(int j=m[i][0]; j<=maxx; ++j) {f[i][j][0] |= f[i-1][j-m[i][0]][0];f[i][j][0] |= f[i-1][j-m[i][0]][1];}for(int j=m[i][1]; j<=maxx; ++j) {f[i][j][1] |= f[i-1][j-m[i][1][0];f[i][j][1] |= f[i-1][j-m[i][1][1];}}int ans = 0;for(int i=maxx;i>=1;--i){//找一桌最多坐几个 if(f[h][i][0] || f[h][i][1]){ans = n - i;break;}}cout << "Yes\n";cout << ans; return 0;
}

官方题解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67427.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

独立站如何批量查收录,教你独立站如何批量查收录的简单方法

独立站批量查收录是提升网站SEO效果的重要步骤。以下提供几种简单且实用的方法,帮助你高效地批量查询独立站的收录情况: 一、使用搜索引擎的Site指令结合自动化脚本 了解Site指令: 在搜索引擎(如谷歌)的搜索框中输入“site:域名”(替换为你的实际域名),执行搜索后,可以…

谷歌收录查询工具,告诉你谷歌收录查询工具使用指南

谷歌收录查询工具是网站管理员和SEO专家用于监控和管理网站在谷歌搜索结果中表现的重要工具。以下是一份详细的谷歌收录查询工具使用指南,旨在帮助你更好地了解和使用这些工具。 一、Google Search Console(谷歌搜索控制台) Google Search Console是谷歌官方提供的免费工具,…

『模拟赛』多校A层冲刺NOIP2024模拟赛01

『模拟赛记录』多校A层冲刺NOIP2024模拟赛01Rank 打得还可以总A. 构造字符串 签,但是挂了 40pts。 发现判条件只有相等和不相等,于是想到并查集维护连通块,将强制相同的两个位置的连通块合并,强制不同的先记下,最后统一判断。 重点在细节处理,合并连通块时要将位置靠后的…

虚拟机类加载机制

1. 类加载时机 一个类型(接口/类)从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将历加载、验证、准备、解析、初始化、使用和卸载七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,…

CSS display属性 inline-block flex grid

CSS display inline-block flex grid ======================================= CSS的display属性是一个核心属性,用于控制元素如何在页面布局中显示,包括其盒模型的行为。以下是display属性的一些常见值及其示例代码:1. block 说明:将元素变为块级元素,独占一行,可以…

[39] (多校联训) A层冲刺NOIP2024模拟赛01

你们不感觉最近机房网越来越慢了吗,现在下个 10M 的东西要用三分钟,而且期间访问不了网站 整个机房分 1000Mbps 的带宽为啥只能分这么一点, huge 拿我电脑挖矿了? 本来以为多校就是多校的,结果是真的多校,一百一十多个人在一块考 huge: 参加的都是咱们北方这几个强校 你说…

事故分享——关于Conda激活环境失败并报gbk相关错误

事情是今天打开了pwsh,突然发现conda的环境没了,启动时提示:UnicodeEncodeError: gbk codec cant encode character \xe5 in position 884: illegal multibyte sequence在网上搜索了许多相关的资料,一度怀疑是代理等问题。 进行过的尝试:清理conda缓存,更新conda版本,删…

【闲话】高一上运动会

“加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!心跳节拍弥梦离 “加油,加油!”虽然没有上场,但记忆也为本次运动会的举办做出了许多努力!想喝矿泉水的话,就请记忆帮你拿一瓶吧!活力四射超神龙女 代表…