题面:https://www.cnblogs.com/Juve/articles/11461528.html

A:字符

暴力模拟一下,细节很多,但是暴力思路都不大一样

先枚举循环节长度,然后处理一个b数组,表示根据已知条件能推出的循环节,不能确定的位置是0

比如第一个样例,在len=5时的b数组是01203,(颜色从1到c,位置从0到len-1)表示第0位和第3位不能确定

在求b数组时顺便可以check这个循环节是否合法

然后求一个pos数组,pos[i]表示i在b数组中最后出现的位置,如果这个颜色没有在b数组中出现,那么pos=-1

然后就可以统计答案,根据贪心,sum[i]=pos[i]-pos[i-1],如果pos[i]=-1,那么sum[i]=1,pos[i]=pos[i-1]+1,

这时check你的pos数组是否大于0,如果不是,则该循环节不合法

比如:01040,其中sum[3]=0,不合法,需要判掉

然后输出sum就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define re register
#define MAXM 100005
using namespace std;
int t,c,m,maxt,b[MAXM],sum[MAXM],pos[MAXM];
bool flag=0;
struct node{
int pk,xk;
friend bool operator < (node p,node q){
return p.pk<q.pk;
}
}a[MAXM];
bool judge(int len){
for(int i=0;i<=c;i++) pos[i]=-1;
memset(b,0,sizeof(b));
for(int i=1;i<=m;i++){
if(b[(a[i].pk-1)%len]==0){
b[(a[i].pk-1)%len]=a[i].xk+1;
}else{
if(b[(a[i].pk-1)%len]==a[i].xk+1) continue;
else return 0;
}
}
int maxx=0;
for(int i=0;i<len;i++){
maxx=max(maxx,b[i]);
if(b[i]) pos[b[i]]=i;
if(b[i]!=0&&b[i]<maxx) return 0;
}
return 1;
}
bool check(int len){
int p=0;
for(int i=1;i<=c;i++){
if(pos[i]==-1){
pos[i]=pos[i-1]+1;
sum[i]=1;
}else sum[i]=pos[i]-pos[i-1];
if(sum[i]<=0) return 0;
p+=sum[i];
}
p-=sum[c];
sum[c]=len-pos[c-1]-1;
if(sum[c]<=0) return 0;
p+=sum[c];
return p==len;
}
signed main(){
//freopen("test.in","r",stdin);
//freopen("vio.out","w",stdout);
scanf("%d%d",&t,&c);
while(t--){
scanf("%d",&m);
if(m==0){
for(int i=1;i<=c;i++) printf("1 ");
puts("");
continue;
}
for(int i=1;i<=m;i++)
scanf("%d%d",&a[i].pk,&a[i].xk);
sort(a+1,a+m+1);
maxt=a[m].pk+c;
for(int i=1;i<=m;i++){
if(a[i].xk<a[i-1].xk){
maxt=a[i].pk;
break;
}
}
memset(sum,0,sizeof(sum));
flag=0;
for(int i=c;i<=maxt;i++){
if(judge(i)){
//for(int j=0;j<i;j++){
// cout<<b[j]<<' ';
//}
//cout<<endl;
if(check(i)){
flag=1;
for(int j=1;j<=c;j++) printf("%d ",sum[j]);
puts("");
break;
}
}
}
if(flag==0) puts("NO");
}
return 0;
}

B:蛋糕

区间dp,记f[i][j]表示拿完环上的区间[i,j]的蛋糕大小之和的最大值,按区间长度的奇偶性转移

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 4005
#define re register
#define int long long
using namespace std;
int n,a[MAXN],ans=0,f[MAXN][MAXN];
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i+n]=a[i];
f[i][i]=f[n+i][n+i]=a[i];
}
a[0]=a[n];
for(int k=1;k<n;++k){
for(int l=1;l+k<=2*n;++l){
int r=l+k-1;
if(k&1){
if(a[l-1]>a[r+1]) f[l-1][r]=max(f[l-1][r],f[l][r]);
else f[l][r+1]=max(f[l][r+1],f[l][r]);
}else{
f[l-1][r]=max(f[l-1][r],f[l][r]+a[l-1]);
f[l][r+1]=max(f[l][r+1],f[l][r]+a[r+1]);
}
}
}
for(int i=1;i<=n;++i) ans=max(ans,f[i][i+n-1]);
printf("%lld\n",ans);
return 0;
}

C:游戏

可以发现,整个过程一定是如下过程的重复:最近的莉露露过来,带上由岐,移动一段距离,然后把由岐抛出去,而且每个莉露露只会行动至多一
次。但是如果暴力建出所有AL+B的边的话复杂度过高,考虑把它拆成B+A+···+A的形式,即每移动1的距离就增加A。可以对每个点(x,y)设置三个状态,记在南北方向被抛出的过程中为(x,y,0)、在东西方向被抛出的过程中为(x,y,1)、在被带着移动的过程中为(x,y,2)。(x,y,0)向(x±1,y,0)连边权为A的有向边,(x,y,1)向(x,y±1,1)连边权为A的有向边,表示正在抛出;(x,y,2)向(x,y,0/1)连边权为B的有向边,表示开始抛出;(x,y,0/1)向(x,y,2)连边权为d(x,y)的有向边(其中d(x,y)表示初始位置离(x,y)最近的莉露露的距离乘C,这可以通过多源点BFS预处理出来),表示落地后最近的莉露露移动过来;(x,y,2)向周围四个方向连边权为C的有向边,表示正在移动。这样建图后,(x1,y1,2)到(xn,yn,0/1/2)的最短路即为答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define MAXN 4000005
#define MAXM 4000005
#define int long long
using namespace std;
int x,y,a,b,c,n,tot,d[505][505],ans=0;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
struct node{
int x,y;
}lilulu[MAXN];
queue< pair<int,int> >que;
int to[MAXM],nxt[MAXM],pre[MAXM],val[MAXM],cnt=0;
void add(int u,int v,int w){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt,val[cnt]=w;
}
int id(int i,int j,int k){
return (i-1)*y+j+k*tot;
}
int dis[MAXN];
priority_queue< pair<int, int> > q;
bool visit[MAXN];
void dijkstra(int x){
memset(dis,0x3f,sizeof(dis));
dis[x]=0;
memset(visit,0,sizeof(visit));
q.push(make_pair(-dis[x],x));
while(!q.empty()){
int y=q.top().second;q.pop();
if(visit[y]) continue;
visit[y]=1;
for(int i=pre[y];i;i=nxt[i]){
int v=to[i],z=val[i];
if(dis[v]>dis[y]+z){
dis[v]=dis[y]+z;
q.push(make_pair(-dis[v],v));
}
}
}
}
signed main(){
scanf("%lld%lld",&x,&y);
++x,++y;
tot=x*y;
memset(d,0x3f,sizeof(d));
scanf("%lld%lld%lld",&a,&b,&c);
scanf("%lld",&n);
for(int i=1;i<=n;++i){
scanf("%lld%lld",&lilulu[i].x,&lilulu[i].y);
lilulu[i].x++,lilulu[i].y++;
que.push(make_pair(lilulu[i].x,lilulu[i].y));
d[lilulu[i].x][lilulu[i].y]=0;
}
while(!que.empty()){
pair<int,int>pa=que.front();
que.pop();
for(int i=0;i<4;i++){
int p=pa.first+dx[i],q=pa.second+dy[i];
if(p>0&&q>0&&p<=x&&q<=y){
if(d[p][q]>d[pa.first][pa.second]+1){
d[p][q]=d[pa.first][pa.second]+1;
que.push(make_pair(p,q));
}
}
}
}
for(int i=1;i<=x;i++){
for(int j=1;j<=y;j++){
if(i-1>0) add(id(i,j,0),id(i-1,j,0),a);
if(i+1<=x) add(id(i,j,0),id(i+1,j,0),a);
if(j-1>0) add(id(i,j,1),id(i,j-1,1),a);
if(j+1<=y) add(id(i,j,1),id(i,j+1,1),a);
add(id(i,j,2),id(i,j,0),b),add(id(i,j,2),id(i,j,1),b);
for(int k=0;k<4;k++){
int p=i+dx[k],q=j+dy[k];
if(p>0&&q>0&&p<=x&&q<=y) add(id(i,j,2),id(p,q,2),c);
}
add(id(i,j,0),id(i,j,2),c*d[i][j]),add(id(i,j,1),id(i,j,2),c*d[i][j]);
}
}
dijkstra(id(lilulu[1].x,lilulu[1].y,2));
ans=min(dis[id(lilulu[n].x,lilulu[n].y,2)],min(dis[id(lilulu[n].x,lilulu[n].y,1)],dis[id(lilulu[n].x,lilulu[n].y,0)]));
printf("%lld\n",ans);
return 0;
}

HZOI20190903模拟36 字符,蛋糕,游戏的更多相关文章

  1. day06-java-(方法,猜字符小游戏)

    day05-java-(方法,猜字符小游戏) 1.方法:  1)用于封装一段特定的逻辑功能  2)方法应尽可能的独立,只干一件事  3)方法可以被反复的调用多次  4)避免代码重复,有利于代码的维护, ...

  2. Python之模拟职场人生游戏

    题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想 ...

  3. 常用Java API之Ramdom--用代码模拟猜数小游戏

    常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...

  4. 用Javascript模拟微信飞机大战游戏

    最近微信的飞机大战非常流行,下载量非常高. 利用JS进行模拟制作了一个简单的飞机大战[此源码有很多地方可以进行重构和优化] [此游戏中没有使用HTML5 任何浏览器都可以运行]. 效果图: 原理:利用 ...

  5. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

  6. python爬虫学习,使用requests库来实现模拟登录4399小游戏网站。

    1.首先分析请求,打开4399网站. 右键检查元素或者F12打开开发者工具.然后找到network选项, 这里最好勾选perserve log 选项,用来保存请求日志.这时我们来先用我们的账号密码登陆 ...

  7. cocos2d-x《农场模拟经营养成》游戏完整源代码

    cocos2d-x农场模拟经营养成游戏完整源代码,cocos2d-x引擎开发,使用JSON交互,支持IOS与 Android,解压后1016MB. 非常强大的游戏源代码         完整游戏源代码 ...

  8. 原生JS实现队结构及利用队列模拟‘击鼓传花’游戏

    1. 前言 队列,是一种遵从先进先出(FIFO,First-In-First-Out)原则的有序集合.队列在尾部添加新元素,并从顶部移除元素,最新添加的元素必须排在队列的末尾. 2.功能说明 enqu ...

  9. 2021.8.11考试总结[NOIP模拟36]

    T1 Dove玩扑克 考场并查集加树状数组加桶期望$65pts$实际$80pts$,考后多开个数组记哪些数出现过,只扫出现过的数就切了.用$set$维护可以把被删没的数去掉,更快. $code:$ 1 ...

随机推荐

  1. thinkphp 定界符

    模板文件可以包含普通模板标签和XML模板标签,标签的定界符都可以重新配置. 大理石平台厂家 普通标签 内置模板引擎的普通模板标签默认以{ 和 } 作为开始和结束标识,并且在开始标记紧跟标签的定义,如果 ...

  2. thinkphp 操作绑定到类

    定义 ThinkPHP3.2版本提供了把每个操作方法定位到一个类的功能,可以让你的开发工作更细化,可以设置参数ACTION_BIND_CLASS,例如: 'ACTION_BIND_CLASS' =&g ...

  3. hibernate_01_SSH环境搭建

    1.maven工程pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="h ...

  4. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  5. PHP面向对象之继承的基本思想

    图例 概念和说明 代码展示 <?php header('content-type:text/html;charset=utf-8'); //学生考试系统 class Student{ publi ...

  6. Java 高级面试知识点汇总!

    1.常用设计模式 单例模式:懒汉式.饿汉式.双重校验锁.静态加载,内部类加载.枚举类加载.保证一个类仅有一个实例,并提供一个访问它的全局访问点. 代理模式:动态代理和静态代理,什么时候使用动态代理. ...

  7. 初识OpenCV-Python - 002: Drawing functions

    使用OpenCV-Python 的画图函数画图. 本次的图形函数有: cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.put ...

  8. C# 字符串的日期比较

    SearchResult = SearchResult.Where(v => (DateTime.Parse(v.CreateTime.ToString("yyyy/MM/dd&quo ...

  9. linux nload命令简介及安装方法

    第一步:nload命令简介 nload 命令用于查看linux网络流量状况,实时输出.可以理解为是一个控制台应用程序,用来实时监测网络流量和带宽使用情况的命令. 使用可视化的界面显示流入和留出系统的网 ...

  10. Android开发 WebView的详解

    前言 WebView 是Android显示html内容的主要方式,当然TextView也可以加载html内容.但是WebView除了功能更加强大,最重要的是还能调用Html里的JavaScript语言 ...