小米 OJ 编程比赛 03 月常规赛
A.数学等式
数据比较小,可以暴力+折半枚举。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
map<int,int>mp;
int main()
{
int N,A,B,C,D,E; ll ans=;
scanf("%d%d%d%d%d",&A,&B,&C,&D,&E);
rep(i,-,)
rep(j,-,)
rep(k,-,){
if(i*j*k==) continue;
int x=A*i*i*i+B*j*j*j+C*k*k*k;
mp[x]++;
}
rep(i,-,)
rep(j,-,){
if(i*j==) continue;
int x=D*i*i*i+E*j*j*j;
ans+=mp[x];
}
printf("%lld\n",ans);
return ;
}
B.贪吃的细胞
最小生成树,即是S和所有的营养液连通,我们把S和营养液看成关键点,那么预处理出关键点之间的两两距离(BFS即可)。
然后从S开始,跑基于prim的最小生成树。 题中,我们需要加限制,即如果A->B要连边(A处一个细胞到B处),那么A的细胞数不能为0,而一个细胞跑到B后,变为c[B]+1个,同时用B到其他点的距离更新最小距离。
(由于std出了问题,我们先假设代码是对的。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=;
char c[maxn][maxn];
int id[maxn][maxn],vis[maxn][maxn],X[maxn],Y[maxn],Z[maxn];
int T,N,M,tot,Sx,Sy,num;
int peo[maxn],used[maxn],Dis[maxn][maxn],ans;
int xx[]={,-,,},yy[]={,,,-};
int dis[maxn][maxn][maxn],qx[maxn*maxn],qy[maxn*maxn],head,tail;
struct in{
int id,dis,from;
in(){}
in(int ii,int dd,int ff):id(ii),dis(dd),from(ff){}
friend bool operator <(in w,in v){
return w.dis>v.dis;
}
};
priority_queue<in>q;
void dfs1(int x,int y)
{
if(x<||x>N||y<||y>M||vis[x][y]||c[x][y]=='#') return ;
vis[x][y]=; if(c[x][y]>=''&&c[x][y]<='') num++;
rep(i,,) dfs1(x+xx[i],y+yy[i]);
}
void get(int p) //得到关键点和其他关键点的距离
{
rep(i,,N) rep(j,,M) dis[p][i][j]=inf;
rep(i,,tot) Dis[p][i]=inf;
head=tail=; head++;
qx[head]=X[p],qy[head]=Y[p]; dis[p][X[p]][Y[p]]=;
while(tail<head){
tail++;
int tx=qx[tail],ty=qy[tail];
rep(i,,){
int rx=tx+xx[i],ry=ty+yy[i];
if(rx>=&&rx<=N&&ry>=&&ry<=M&&c[rx][ry]!='#'&&dis[p][rx][ry]==inf){
dis[p][rx][ry]=dis[p][tx][ty]+;
if(id[rx][ry]) Dis[p][id[rx][ry]]=dis[p][rx][ry];
head++; qx[head]=rx; qy[head]=ry;
}
}
}
}
void solve()
{
rep(i,,tot) get(i);
rep(i,,tot) peo[i]=used[i]=;
peo[]=; ans=; int sz=; used[]=;
rep(i,,tot) if(Dis[][i]!=inf){
q.push(in(i,Dis[][i],)); //sz++;
}
while(!q.empty()){ //每次贪心的找最小边
in t=q.top(); q.pop();
if(t.id&&peo[t.from]&&!used[t.id]){
peo[t.from]--; used[t.id]=; ans+=t.dis;
peo[t.id]+=+Z[t.id]; sz++;
rep(i,,tot) if(!used[i]&&Dis[t.id][i]!=inf){ //来源有多的细胞,且目的地没有被用掉,则合法
q.push(in(i,Dis[t.id][i],t.id));
}
}
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%s",c[i]+);
tot=num=;
rep(i,,N) rep(j,,M) id[i][j]=vis[i][j]=;
rep(i,,N)
rep(j,,M){
if(c[i][j]>=''&&c[i][j]<='') {
id[i][j]=++tot;
X[tot]=i; Y[tot]=j; Z[tot]=c[i][j]-'';
}
else if(c[i][j]=='S'||c[i][j]=='s') X[]=Sx=i,Y[]=Sy=j;
}
dfs1(Sx,Sy);
if(num!=tot){ puts("-1"); continue;}
solve();
printf("%d\n",ans);
}
return ;
}
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=;
char c[maxn][maxn];
int id[maxn][maxn],vis[maxn][maxn],X[maxn],Y[maxn],Z[maxn];
int T,N,M,tot,Sx,Sy,num;
int peo[maxn],used[maxn],Dis[maxn][maxn],ans;
int xx[]={,-,,},yy[]={,,,-};
int dis[maxn][maxn][maxn],qx[maxn*maxn],qy[maxn*maxn],head,tail;
struct in{
int id,dis,from;
in(){}
in(int ii,int dd,int ff):id(ii),dis(dd),from(ff){}
friend bool operator <(in w,in v){
return w.dis>v.dis;
}
};
priority_queue<in>q;
void dfs1(int x,int y)
{
if(x<||x>N||y<||y>M||vis[x][y]||c[x][y]=='#') return ;
vis[x][y]=; if(c[x][y]>=''&&c[x][y]<='') num++;
rep(i,,) dfs1(x+xx[i],y+yy[i]);
}
void get(int p)
{
rep(i,,N) rep(j,,M) dis[p][i][j]=inf;
rep(i,,tot) Dis[p][i]=inf;
head=tail=; head++;
qx[head]=X[p],qy[head]=Y[p]; dis[p][X[p]][Y[p]]=;
while(tail<head){
tail++;
int tx=qx[tail],ty=qy[tail];
rep(i,,){
int rx=tx+xx[i],ry=ty+yy[i];
if(rx>=&&rx<=N&&ry>=&&ry<=M&&c[rx][ry]!='#'&&dis[p][rx][ry]==inf){
dis[p][rx][ry]=dis[p][tx][ty]+;
if(id[rx][ry]) Dis[p][id[rx][ry]]=dis[p][rx][ry];
head++; qx[head]=rx; qy[head]=ry;
}
}
}
}
void solve()
{
rep(i,,tot) get(i);
rep(i,,tot) peo[i]=used[i]=;
peo[]=; ans=; int sz=; used[]=;
rep(i,,tot) if(Dis[][i]!=inf){
q.push(in(i,Dis[][i],)); //sz++;
}
while(!q.empty()){
in t=q.top(); q.pop();
if(t.id&&peo[t.from]&&!used[t.id]){
peo[t.from]--; used[t.id]=; ans+=t.dis;
peo[t.id]+=+Z[t.id]; sz++;
rep(i,,tot) if(!used[i]&&Dis[t.id][i]!=inf){
q.push(in(i,Dis[t.id][i],t.id));
}
}
}
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
rep(i,,N) scanf("%s",c[i]+);
tot=num=;
rep(i,,N) rep(j,,M) id[i][j]=vis[i][j]=;
rep(i,,N)
rep(j,,M){
if(c[i][j]>=''&&c[i][j]<='') {
id[i][j]=++tot;
X[tot]=i; Y[tot]=j; Z[tot]=c[i][j]-'';
}
else if(c[i][j]=='S'||c[i][j]=='s') X[]=Sx=i,Y[]=Sy=j;
}
dfs1(Sx,Sy);
if(num!=tot){ puts("-1"); continue;}
solve();
printf("%d\n",ans);
}
return
C.小爱密码 2.0
一看就是规律题,打出前面几个,发现除了前面两个其他的下标都是素数,那么我们素数筛得到所有对应的fib下标即可。 然后针对问题,我们矩阵乘法得到对应的答案,然后exgcd求逆元。(m不是素数,不能快速幂求逆元。
打表代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
ll a[];
int main()
{
a[]=; a[]=;
rep(i,,) a[i]=a[i-]+a[i-];
rep(i,,){
int f=;
rep(j,,i-) if(a[i]%a[j]==) f=;
if(!f) cout<<i<<" ";
}
return ;
}
矩阵快速幂代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
bool vis[maxn]; int p[],cnt,Mod;
void prime()
{
for(int i=;i<maxn;i++){
if(!vis[i]){
p[++cnt]=i;
if(cnt==) break;
}
for(int j=;j<=cnt&&i*p[j]<maxn;j++){
vis[i*p[j]]=;
if(i%p[j]==) break;
}
}
}
struct mat{
int m[][];
mat(){memset(m,,sizeof(m));}
friend mat operator *(mat a,mat b){
mat res;
rep(i,,)
rep(j,,)
rep(k,,) (res.m[i][j]+=1LL*a.m[i][k]*b.m[k][j]%Mod)%=Mod;
return res;
}
friend mat operator ^(mat a,int x){
mat res; res.m[][]=res.m[][]=;
while(x){
if(x&) res=res*a; a=a*a; x>>=;
} return res;
}
};
int getfib(int N)
{
mat ans,base;
ans.m[][]=ans.m[][]=;
base.m[][]=base.m[][]=base.m[][]=;
ans=(base^(N-))*ans;
return ans.m[][];
}
void exgcd(int a,int b,int d,int &x,int &y)
{
if(b==){ d=a; x=; y=; return;}
exgcd(b,a%b,d,y,x); y-=a/b*x;
}
int rev(int a,int b)
{
int x,y,d;
exgcd(a,b,d,x,y); return (x+b)%b;
}
int main()
{
prime(); int N;
p[]=; p[]=;
while(~scanf("%d%d",&N,&Mod)){
N=p[N];
int ans=getfib(N);
ans=1LL*ans*rev(,Mod)%Mod;
int L=,x=ans;
while(x){ x/=; L++;}
if(ans==) L++;
rep(i,,-L) putchar('*');
printf("%d\n",ans);
}
return ;
}
小米 OJ 编程比赛 03 月常规赛的更多相关文章
- 小米 OJ 编程比赛 01 月常规赛_灯_找规律
灯 序号:#125难度:有挑战时间限制:1000ms内存限制:32M 描述 一个屋子有 n 个开关控制着 n 盏灯,但奇怪的是,每个开关对应的不是一盏灯,而是 n-1 盏灯,每次按下这个开关,其对应 ...
- 小米 OJ 编程比赛 02 月常规赛
Carryon 数数字 描述 Carryon 最近迷上了数数字,然后 Starry 给了他一个区间[l,r] ,然后提了几个要求, 需要将 ll 到 rr 之间的数全部转化成 16 进制,然后连起来. ...
- 小米 OJ 编程比赛 02 月常规赛 3 Logic Gatekeeper CDQ分治
link:https://code.mi.com/problem/list/view?id=139 题意: 有一个1e6 * 1e6 大的格子,现在有两种操作:1,给一个子矩阵中的每个格子加上k.2, ...
- 小米 oj 硬币比赛(思维+动态规划)
硬币比赛 序号:#47难度:困难时间限制:1000ms内存限制:10M 描述 有 n 个不同价值的硬币排成一条线.有 A 与 B 两个玩家,指定由 A 开始轮流(A 先手,然后 B,然后再 A..) ...
- 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板
第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...
- 001-电脑操作规范-2019年03月.doc
001-电脑操作规范-2019年03月.doc 本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941 /////////////////////////////////////// ...
- CSDN挑战编程——《金色十月线上编程比赛第二题:解密》
金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...
- java:编程比赛中有用的方法整理(一)数组
我曾经参加过几次编程比赛,但是当时用的是c语言,现在学习了java,打算专攻java组,故以此整理. 数组无论在哪里都必不可少. 一.数组的拷贝: 使用Arrays类的copyOf方法: 1.将一个数 ...
- 黑洞有毛 or 黑洞无毛:4星|《环球科学》2019年03月号
<环球科学>2019年03月号 高水平的科普杂志.本期我感兴趣的话题有: 1:65岁以上老年人是转发假新闻的主力: 2:人的面孔特征可以通过50个维度来定义: 3:华裔科学家发现人脑颞叶中 ...
随机推荐
- 关于JAVA的一些知识点
1.java.lang.Runtime.getRuntime().availableProcessors() Returns the number of processors available to ...
- 运行网站项目时,有时出现Bad Request,该怎么解决?
有时运行网站项目时,出现Bad Request问题
- 学习笔记-AngularJs(五)
之前的页面太丑了,后来我引入了bootstrap.css,把样式进行修了一番,如下图(一不小心,插入个链接,忽略,http://t.cn/RUbL4rP): (链接:http://www.live08 ...
- Linux第九周作业
学习笔记 不同类型的进程有不同的调度需求,其中分为两类 第一类:I/O-bound(频繁进行I/O,花费长时间等待I/O操作的完成)CPU-bound(计算密集型,需要大量的CPU时间进行运算) 第二 ...
- linux磁盘管理 磁盘查看操作
df查看磁盘分区使用状况 df --显示磁盘分区使用状况 'l' 仅显示本地磁盘(默认) 'a' 显示所有文件系统的磁盘使用情况,包含比如/proc/ 'h' 以1024进制计算最合适的单位显示磁盘容 ...
- 回溯算法 LEETCODE别人的小结 一八皇后问题
回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目的.但是当探索到某 ...
- vue-router-5-命名路由
创建 Router 实例的时候,在 routes 配置中给某个路由设置名称 const router = new VueRouter({ routes: [ { path: '/user/:userI ...
- angular 离开页面相关操作
$scope.$on("$destroy", function() { $interval.cancel(autoRefresh);})
- Python3虚拟环境安装:virtualenv、virtualenvwralpper
一:通过pip3(因python2和3共存,前文修改过pip3软连接,pip3可以安装到python3)安装virtualenv,pip3 install virtuale 二:建立虚拟环境文件目录 ...
- AntPathMatcher做路径匹配
转发自: http://www.cnblogs.com/leftthen/p/5212221.html 需要看详细的请看上面的链接 这里以我这里的一个Filter 中需要对路径做例外处理,filter ...