2017南宁(重温经典)

  • 导语
  • 涉及的知识点
  • 题目
    • H
    • I
    • M
    • L
  • 参考文献

导语

这场打的还可以,也学到了二分图的更简单的建图和匹配实现,虽然以前看过,但没有着重关注,这次直接整理了

涉及的知识点

二分图,模拟,递推

链接:训练赛 [Cloned]

题目

H

题目大意:略

思路:这道题给了一个启示,小的细节优化往往能带来出其不意的效果
思路是直接模拟暴力,但是如果直接从整个大平面空间逐个遍历显然是不合算的,可以发现,活着的细胞相比于整个平面空间都是少数,那么可以从这一部分入手,我们记录活着的人存在的区域,或者说涉及到的区域,每次对这个区域进行一次遍历,并判断是否产生了拓展,如果区域被拓展,那么更新即可,这样的总体复杂度会很低

代码

#include<bits/stdc++.h>
using namespace std;
int t,n,m;
int a[700][700],b[700][700];//相互作为临时数组
int getAround(bool flag,int x,int y) {//判断当前位置周围int sum=0;if(flag) {sum-=a[x][y];for(int i=-1; i<=1; i++)for(int j=-1; j<=1; j++)sum+=a[x+i][y+j];} else {sum-=b[x][y];for(int i=-1; i<=1; i++)for(int j=-1; j<=1; j++)sum+=b[x+i][y+j];}return sum;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cin >>t;while(t--) {cin >>n>>m;memset(a,0,sizeof(a));//初始化memset(b,0,sizeof(b));//同上char ch;int sum=0,mx=0,pos=0,d=350,u=350+5,l=350,r=350+5;//初始化边界for(int i=0; i<n; i++)for(int j=0; j<m; j++) {cin >>ch;if(ch=='#')a[350+i][350+j]=1,sum++,mx++;}for(int i=1; i<=321; i++) {sum=0;if(i&1) {for(int i=d-1; i<=u+1; i++)//只判断涉及到的范围for(int j=l-1; j<=r+1; j++) {int res=getAround(1,i,j);b[i][j]=a[i][j];if((res<2||res>3)&&a[i][j])b[i][j]=0;else if(res==3&&!a[i][j])b[i][j]=1;sum+=b[i][j];if(b[i][j]) {//如果可以拓展if(i==d-1)d--;else if(i==u+1)u++;if(j==l-1)l--;else if(j==r+1)r++;}}} else {for(int i=d-1; i<=u+1; i++)//只判断涉及到的范围for(int j=l-1; j<=r+1; j++) {int res=getAround(0,i,j);a[i][j]=b[i][j];if((res<2||res>3)&&b[i][j])a[i][j]=0;else if(res==3&&!b[i][j])a[i][j]=1;sum+=a[i][j];if(a[i][j]) {if(i==d-1)d--;else if(i==u+1)u++;if(j==l-1)l--;else if(j==r+1)r++;}}}if(sum>mx)pos=i,mx=sum;}cout <<pos<<" "<<mx<<" "<<sum<<endl;}return 0;
}

I

题目大意:给出一共4×4矩阵,A和B对矩阵轮流操作,A先操作,每次操作选择一个2×2的矩阵,统计矩阵元素和加在总分数上,然后将这个2×2矩阵逆时针旋转90度,一共进行k轮,也就是2k次操作,A的目标是使得总分数最大,B的目标是使得总分数最小,计算两人在最优策略下最后获得的总分数

思路:直接暴力,可以计算出总时间复杂度由于数据范围很小

代码

#include<bits/stdc++.h>
using namespace std;
int t,n,m,k,a[12][12];
int getsum(int x,int y) {return a[x][y]+a[x+1][y]+a[x][y+1]+a[x+1][y+1];
}
void up(int x,int y) {int tmp=a[x][y];a[x][y]=a[x][y+1];a[x][y+1]=a[x+1][y+1];a[x+1][y+1]=a[x+1][y];a[x+1][y]=tmp;
}
void down(int x,int y) {int tmp=a[x][y];a[x][y]=a[x+1][y];a[x+1][y]=a[x+1][y+1];a[x+1][y+1]=a[x][y+1];a[x][y+1]=tmp;
}
int DFS(int level) {//参数为第level次操作if(level==2*k) {int mn=0x3f3f3f3f;for(int i=1; i<4; i++)for(int j=1; j<4; j++)mn=min(mn,getsum(i,j));return mn;}if(level&1) {//A操作int mx=0;for(int i=1; i<4; i++)for(int j=1; j<4; j++) {up(i,j);//操作int sum=getsum(i,j)+DFS(level+1);//遍历所有情况,直接看到最后一步mx=max(mx,sum);down(i,j);//还原}return mx;}int mn=0x3f3f3f3f;//B操作for(int i=1; i<4; i++)for(int j=1; j<4; j++) {up(i,j);int sum=getsum(i,j)+DFS(level+1);mn=min(mn,sum);down(i,j);}return mn;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);cin >>t;while(t--) {cin >>k;for(int i=1; i<=4; i++)//录入矩阵for(int j=1; j<=4; j++)cin >>a[i][j];cout <<DFS(1)<<endl;}return 0;
}

M

题目大意:给出一共有向无环图 G G G,定义一个点集 V U R ⊂ V V_UR⊂V VU​R⊂V作为 G G G的不可达集,集合中的任意两点 u , v u,v u,v两者间都不存在路径可到达彼此,求出 G G G的最大不可达集的大小

思路:很显然图被分成了两个集合,那么求的就是二分图的最大独立集,由于点很少,直接用矩阵存即可,跑最大匹配,最大独立集=总结点数-最大匹配

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int n,m,match[121],res;
bool graph[121][121],vis[121];
bool maxmatch(int u) {for(int v=1; v<=n; v++) {//BFSif(!vis[v]&&graph[u][v]) {//如果没访问过vis[v]=1;if(match[v]==-1||maxmatch(match[v])) { //如果可以匹配match[v]=u;//设定匹配return 1;}}}return 0;
}
int main() {ios::sync_with_stdio(0);cin.tie(0);int T;cin >>T;while(T--) {cin >>n>>m;memset(graph,0,sizeof(graph));while(m--) {int u,v;cin >>u>>v;graph[u][v]=1;}memset(match,-1,sizeof(match));res=0;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)for(int k=1; k<=n; k++)graph[i][j]|=graph[i][k]&graph[k][j];for(int i=1; i<=n; i++) {memset(vis,0,sizeof(vis));if(maxmatch(i))res++;}cout <<n-res<<endl;}return 0;
}

L

题目大意:给出一个正整数 L L L,找到一个最小的不小于 L L L的整数 n n n,使得存在一个正整数 m m m满足等式 2 m ( m + 1 ) = n ( n + 1 ) 2m(m+1)=n(n+1) 2m(m+1)=n(n+1)

思路:首先数据量给的很大,因此线性遍历是不可能的,并且需要使用大数来进行存储与运算,因此使用Java语言,将等式中的 n n n视为已知,那么最后可以得到 m m m的表达式: 1 + 2 n 2 + 2 n / 2 − 1 / 2 \sqrt{1+2n^2+2n}/2-1/2 1+2n2+2n ​/2−1/2,打表可以得到符合条件的 n n n的递推式: a [ i ] = ( a [ i − 1 ] + a [ i − 2 ] ) ∗ 5 + 4 − a [ i − 3 ] a[i]=(a[i-1]+a[i-2])*5+4-a[i-3] a[i]=(a[i−1]+a[i−2])∗5+4−a[i−3]

代码

import java.math.BigInteger;
import java.util.Scanner;public class Main {static BigInteger a[]= new BigInteger[2010];public static void main(String[] args) {// TODO Auto-generated method stubinit();Scanner inputScanner=new Scanner(System.in);int t = inputScanner.nextInt();for(int i = 1;i <= t;i++){String string = inputScanner.next();BigInteger lBigInteger = new BigInteger(string);int l = 0;int r = 2000;if(lBigInteger.compareTo(a[l])<=0) {System.out.println(a[l].toString());}else {while(l<r){int mid = (l+r)/2;if(a[mid].compareTo(lBigInteger)>=0){r=mid;}else {l=mid+1;}}System.out.println(a[l].toString());}}}static void init() {a[0]=new BigInteger("3");a[1]=new BigInteger("20");a[2]=new BigInteger("119");for(int i=3;i<=2000;i++){a[i]=(a[i-1].add(a[i-2])).multiply(BigInteger.valueOf(5)).add(BigInteger.valueOf(4)).subtract(a[i-3]);}}
}

参考文献

  1. icpc2017南宁H The Game of Life
  2. ACM 2017 南宁区域赛 Rake it in(对抗搜索)

2017南宁(重温经典)相关推荐

  1. 电影AI修复,让重温经典有了新的可能

    摘要:有没有一种呈现,不以追求商业为第一目的,不用花大价钱,不用翻拍,没有画蛇添足,低成本的可共赏的让经典更清晰? 本文分享自华为云社区<除了重映和翻拍,重温经典的第三种可能>,原文作者: ...

  2. 2020icpc上海(重温经典)

    2020icpc上海(重温经典) 导语 涉及的知识点 题目 B D G H I M 参考文献 导语 涉及的知识点 思维,几何,搜索 链接:第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海 ...

  3. 2021上海站(重温经典)

    2021上海站(重温经典) 导语 涉及的知识点 题目 D E G I K 参考文献 导语 拿来练手的,好长时间没弄了,生疏了不少,思维和分析需要再加强 涉及的知识点 思维,数学,背包DP,树形DP,K ...

  4. 重温经典:简读光干涉、衍射原理

    如果您不是光学专业的,或者是文科生,那么您想到光的干涉和衍射第一反应应该是很多公式对不对?头好大是不是?好,那么今天我们就不用一个公式来重新解读光的干涉和衍射. 光,也叫电磁波,他的表现形式我们通常用 ...

  5. 2018青岛(重温经典)

    2018青岛(重温经典) 导语 涉及的知识点 题目 C D E F J M 参考文献 导语 难度不高的一次训练,但是还是很考思维的 涉及的知识点 思维,构造,平面几何,搜索 链接:The 2018 A ...

  6. 让我们重温经典---TVB十大感人爱情故事

    让我们重温经典---TVB十大感人爱情故事 此主题相关图片如下: 1.<上海滩>:当许文强中枪后,丁力抱着许文强,许文强临死前说:"你知道我要去哪儿么?我要去找程程." ...

  7. 让电影票房飞一会儿,五一换个姿势重温经典

    距离五一小长假,还有不到20个小时!和我们一起迎接五一的,还有14部影片,号称史上最挤五一档!小编没有说错,"最挤"而不是"最强". 五一电影预售票房已经出炉, ...

  8. linux win95模拟,【重温经典】Windows 95 模拟软件--记忆中的扫雷和纸牌

    软件平台:Windows/Mac os/Linux 今天给大家分享一个东西,虽然没啥卵用... 简单介绍 聊天软件 Slack 的开发者 Felix Rieseberg 把 Windows 95 变成 ...

  9. 【重温经典】MIT人工智能实验室: 如何做研究?丨附下载

    https://dspace.mit.edu/bitstream/handle/1721.1/41487/AI_WP_316.pdf (也可以点击文末" 阅读原文 "链接获取完整文 ...

最新文章

  1. 【运筹学】线性规划 单纯形法 ( 原理 | 约定符号 | 目标系数矩阵 C | 目标函数变量矩阵 X | 约束方程常数矩阵 b | 系数矩阵 A | 向量 | 向量符号 | 向量 Pj )
  2. 清华大学图神经网络综述:模型与应用
  3. 手把手教你实现SVM算法(二)
  4. STM 32如何实现程序自加密
  5. 如何做SEO项目管理?
  6. [Cocoa]深入浅出 Cocoa 之 Core Data(2)- 手动编写代码
  7. c++ builder 存储过程 mysql mssql_C++ Builder实现Microsoft SQL Server 2000 的扩展存储过程...
  8. 拓端tecdat|R语言对股票风险“溃疡指数”( Ulcer Index)曲面图可视化
  9. 智能信息处理专业是干嘛的?
  10. 微信小程序 java家庭个人收支理财记账本springboot
  11. java web服务器热部署_Tomcat服务器热部署教程_如何实现tomcat热部署
  12. FU-A STAP-A 拆包 打包 小议
  13. winrm java客户端_winrm service
  14. 【Cpp】C和C++混合编程
  15. 杭州电子科技大学ACM 1018
  16. java三维数组的遍历
  17. Vue页面生成分享海报最详说明(含二维码+多种水印方式+常见的坑处理)
  18. H3 R4900 G3装系统详细步骤
  19. Andorid微信刷脸支付使用过程解析
  20. java计算机毕业设计精品旅游项目管理系统MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. 【DL】——Warmup学习率调整策略
  2. 【XSY2753】LCM
  3. 多媒体计算机系统主要分为三类,03多媒体计算机系统组成.ppt
  4. 数值分析快速复习(1)——Matlab数值积分
  5. iOS 开发怎么入门?
  6. linux运行o文件是什么,Linux的.a、.so和.o文件
  7. golang 加密文件_如何使用Go加密文件
  8. 如何提升Google排名?
  9. MongoDB学习指导
  10. 尖峰在线培训 http://www.jianfengedu.com/