小米 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:华裔科学家发现人脑颞叶中 ...
随机推荐
- listener.ora和tnsnames.ora格式解析
listener.ora是oracle数据库服务端的监听配置文件,包括协议.IP地址和端口等内容:tnsnames.ora是oracle数据库客户端的连接配置文件,也是对应的协议.IP地址和端口等内容 ...
- 微信小程序 HMACSHA256 哈希加密
下载CryptoJS, 增加红色的这句 module.exports = CryptoJS /* CryptoJS code.google.com/p/crypto-js (c) 2009-2012 ...
- angular组件之间的通讯
组件通讯,意在不同的指令和组件之间共享信息.如何在两个多个组件之间共享信息呢. 最近在项目上,组件跟组件之间可能是父子关系,兄弟关系,爷孙关系都有.....我也找找了很多关于组件之间通讯的方法,不同的 ...
- pytesseract 验证码识别
以下代码,如有不懂加群讨论# *-* coding:utf-8 *-* #import jsonimport requestsimport pytesseractimport timeimport d ...
- C++11 并发之std::thread std::mutex
https://www.cnblogs.com/whlook/p/6573659.html (https://www.cnblogs.com/lidabo/p/7852033.html) C++:线程 ...
- AI标尺,管理面板5.8
拖动左上角的十字形,如图 重新定义坐标原点,双击十字形则恢复默认原点. 如果一个AI文件打开之后有多个画板,那么在重新存储的时候勾选“将每一个画板存储为单独的文件”那么每个画板都存储为单独的画板. “ ...
- Win10系列:UWP界面布局进阶4
在开发Windows应用商店应用程序时,可以为页面中的界面元素添加快捷菜单,并设置与其相关的菜单项,用户通过选择快捷菜单中的菜单项来执行与被选择对象相关的操作.下面通过一个示例来介绍如何为页面中的一张 ...
- UVALive 3401 - Colored Cubes 旋转 难度: 1
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- day01 初识Python
今日主要内容 1.初识python 2.简单了解下python的数据类型 nubmer=int(input("请输入数字大小:")) if nubmer>66: print( ...
- Python数据分析中对重复值、缺失值、空格的处理
对重复值的处理 把数据结构中,行相同的数据只保留一行 函数语法: drop_duplicates() from pandas import read_csv df = read_csv(文件位置) n ...