vp上古场次ing

CF225A Dice Tower

1.题目简述:

有 \(n\) 个骰子被叠在了一起。对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) 。

你是小明,你只能从正面看这个骰子塔,你看到了每一个骰子的两面 \(a\) 与 \(b\) 。以及最顶上的数。

试问是否有可能用正常的骰子叠出描述中的骰子塔?

如果可以输出 \(\text{YES}\) ,否则输出 \(\text{NO}\) 。

2.解析:

问你是否能用正常的骰子堆出描述中的塔,那就是判断是否这个塔里会有不正常的骰子,也就是不是每个面的数字互不相同。

我们发现我们知道了顶上骰子的三个面,那么我们根据面对面的数字和为 \(7\) 。可以把第一个骰子的六面确定。

然后,这时第二个骰子的六面中也有三面被确定了。然后就可以往下做。

那么我们就只需要判定是否有一个骰子中有两面是相同的。

由于我们已知合法两面,那我们只用判断这两面是否有一面的值为骰子的顶部元素或者骰子的底部元素即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 300;
int n,x,y;
struct node{
int a,b;
}f[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n>>x;
y=7-x;
for(int i=1;i<=n;i++){
cin>>f[i].a>>f[i].b;
if(f[i].a==x||f[i].a==y){
printf("NO");return 0;
}
if(f[i].b==x||f[i].b==y){
printf("NO");return 0;
}
}
printf("YES");
return 0;
}

CF225B Well-known Numbers

1.题目描述:

将一个数拆成若干个 \(k\) 阶斐波那契数的和,要求总数不小于 \(2\) 。

2.解析:

我们都知道传统的斐波那契数列是 \(f_i=f_{i-1}+f_{i-2}\) 。是将前两个数加起来作为自己的值。而扩展的斐波那契数列就是将自己的前 \(k\) 个数加起来作为自己的值。

然后在 \(f_k\) 之前的数为 \(0\) , \(f_k=1\) 。

我们发现 \(k\) 很大。直接去求就死了。

那么我们可以把 \(k\) 当为 \(1\) ,然后所有数减去一个 \(k\) 。

这样就是从 \(0\) 开始了,然后因为在 \(k\) 之前的数都为 \(0\) 。

所以不需要考虑这些数的值,然后计算每个 \(f\) 就做前缀和就完事了。

然后因为我们知道斐波那契数在几千次后已经很大了,同理的我们只用求几千次的 \(k\) 阶斐波那契数,然后从大到小往下取。

如果取出来,个数不满,那就加上 \(0\) 就是了。

因为 \(0\) 也是一个满足要求的斐波那契数。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 50000;
int sum,k,s[N],f[N],tot,ans[N],num;
signed main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>sum>>k; //你模拟一下,就发现他就是加前面的k个
f[0]=0;f[1]=1;f[2]=1;
s[0]=0;s[1]=1;s[2]=2;
int g=0;
for(int i=3;i<=4000;i++){
int it=max(i-k,(int)1);
f[i]=s[i-1]-s[it-1];
s[i]=s[i-1]+f[i];
if(f[i]<0){
g=i-1;
break;
}
}
for(int i=g;i>=1;i--){
if(sum>=f[i]){
sum-=f[i];
ans[++num]=f[i];
}
}
if(num<=2){
ans[++num]=0;
}
sort(ans+1,ans+num+1);
cout<<num<<"\n";
for(int i=1;i<=num;i++){
cout<<ans[i]<<" ";
}
return 0;
}

CF225C Barcode

1.题目描述:

有一个方阵,要让每一列的颜色相同。然后连续相同的颜色列数在 \(x\) 与 \(y\) 之间。求最少的染色数。

2.解析:

这是一道有意思的 dp ,给了我一些启发。

你发现这个有一个有意思的限制,它要求了连续相同的颜色列数有一个范围。那你要考虑取限制这个东西。

怎么限制啊,感觉不太好限制。

后面想了一下,你可以这样来设立状态为 dp[i][0/1] 表示的是当前考虑到了第 \(i\) 列,染色为白色或者黑色的最少颜色数。

那接下来我们直接枚举从往后染 \(x\) 与 \(y\) 之间的列数为同一颜色。也就是把整个图划分为相邻颜色不同的矩形。

我们设 \(j\) 表示往后面染 \(j\) 列为同一颜色。

那么可以写出状态转移方程为:

\[dp[i+j][0]=\min(dp[i+j][0],dp[i][1]+s[i+j]-s[i])
\]
\[dp[i+j][1]=\min(dp[i+j][1],dp[i][0]+t[i+j]-t[i])
\]

然后就解决了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2060;
int n,m,x,y,a[N][N],s[N],t[N],ans,vis[N];
int dp[N][3];
signed main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n>>m>>x>>y;
for(int i=1;i<=n;i++){
string ssh;
cin>>ssh;
for(int j=0;j<m;j++){
if(ssh[j]=='#') s[j+1]++;
else t[j+1]++;
}
}
for(int j=1;j<=m;j++){
s[j]+=s[j-1];t[j]+=t[j-1];
}
memset(dp,127,sizeof(dp));
dp[0][0]=dp[0][1]=0;
for(int i=0;i<m;i++){
for(int j=x;j<=y;j++){
if(i+j>m) break;
dp[i+j][0]=min(dp[i+j][0],dp[i][1]+s[i+j]-s[i]);
dp[i+j][1]=min(dp[i+j][1],dp[i][0]+t[i+j]-t[i]);
}
}
cout<<min(dp[m][0],dp[m][1]);
return 0;
}

CF225D Snake

1.题目描述:

贪吃蛇

2.解析:

这道题真的很强,不愧是 \(2200\) 的分,我开始想了一下,觉得这道题就是一个傻逼的要死的 bfs ,然后注意判断就可以了,然后直接提交。 发现 \(WA\) \(on\) \(53\) 原来是因为如果直接判读回去的不行,那么就会在某些特殊情况下失败,可以自己模拟一下。这里不详细赘述。然后看了官方题解,教我用状压来做,然后就状压 \(BFS\) 就行了。 最后因为你是用的4位状压,注意各种位移操作都要再乘上2。然后就完了,难点在于想到怎么状压,不过好像CF上有人用的 \(hash\) ? 反正很神奇

另外,此题是我改变码风的第一题/cy

#include<bits/stdc++.h>
using namespace std;
int n,m,a[15][15],in[15][15],dp[15][15][1<<16];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int tx,ty,ux[20],uy[20],s,tag;
struct snake{int x,y,t;};
int get(int nx,int ny,int rx,int ry){
for(int i=0;i<4;i++)
if(nx+dx[i]==rx&&ny+dy[i]==ry) return i;
return 0;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
char ch;
cin>>ch;
a[i][j]=ch;
if('1'<=ch&&ch<='9'){
ux[ch-'1']=i;
uy[ch-'1']=j;
s=max(ch-'0',s);
}
else if(ch=='@'){tx=i;ty=j;}
}
}
int st=0,mask=(1<<(2*s-2))-1,sx=ux[0],sy=uy[0];
for(int i=1;i<s;i++) st|=get(ux[i],uy[i],ux[i-1],uy[i-1])<<(i*2-2);
queue<snake>q;
q.push(snake{sx,sy,st});
memset(dp,-1,sizeof(dp));
dp[sx][sy][st]=0;
while(q.size()){
snake now=q.front();q.pop();
int x=now.x,y=now.y,t=now.t;
int nx=x,ny=y,nt=t;
in[x][y]=++tag;
for(int i=2;i<s;i++){
int d=(nt&3)^2;
nx+=dx[d];ny+=dy[d];
nt>>=2;
in[nx][ny]=tag;
}
for(int i=0;i<4;i++){
int xx=x+dx[i];
int yy=y+dy[i];
int dt=((t<<2)&mask)|i;
if(xx<0||yy<0||xx>=n||yy>=m||in[xx][yy]==tag||a[xx][yy]=='#'||~dp[xx][yy][dt]) continue;
dp[xx][yy][dt]=dp[x][y][t]+1;
q.push(snake{xx,yy,dt});
}
}
int ans=INT_MAX;
for(int i=0;i<1<<16;i++){
if(~dp[tx][ty][i]) ans=min(ans,dp[tx][ty][i]);
}
if(ans==INT_MAX) ans=-1;
cout<<ans;
return 0;
}

CF225E 咕咕咕

Codeforces Round #139 (Div. 2) 题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  3. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  4. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

  5. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  6. Codeforces Round #677 (Div. 3) 题解

    Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...

  7. Codeforces Round #665 (Div. 2) 题解

    Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...

  8. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

  9. Codeforces Round #383 (Div. 2) 题解【ABCDE】

    Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...

随机推荐

  1. 使用vue-i18n实现中英文切换(内含动态属性的绑定)

    最近做学生管理系统,因为有国外的学生,所以要进行中英文切换,查了查Vue中使用vue-i18n插件能够实现网页的中英文切换,学习内容如下: 一.下载vue-i18n插件 npm install vue ...

  2. springboot整合JDBC出现Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'.

    今天使用springboot整合JDBC的使用,开始使用的是 com.mysql.jdbc.Driver驱动 结果运行出现此异常 那我们根据提示要求来修改即可 把驱动改成最新的com.mysql.cj ...

  3. 为什么选择b+树作为存储引擎索引结构

    为什么选择b+树作为存储引擎索引结构 在数据库或者存储的世界里,存储引擎的角色一直处于核心位置.往简单了说,存储引擎主要负责数据如何读写.往复杂了说,怎么快速.高效的完成数据的读写,一直是存储引擎要解 ...

  4. 在命令行模式下查看Python帮助文档---dir、help、__doc__

    在命令行模式下查看Python帮助文档---dir.help.__doc__   1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  5. TensorFlow之keras.layers.Conv2D( )

    keras.layers.Conv2D( ) 函数参数 def __init__(self, filters, kernel_size, strides=(1, 1), padding='valid' ...

  6. Json文件解析(下)

    Json文件解析(下) 代码地址:https://github.com/nlohmann/json   从STL容器转换 任何序列容器(std::array,std::vector,std::dequ ...

  7. SpringBoot2 参数管理实践,入参出参与校验

    一.参数管理 在编程系统中,为了能写出良好的代码,会根据是各种设计模式.原则.约束等去规范代码,从而提高代码的可读性.复用性.可修改,实际上个人觉得,如果写出的代码很好,即别人修改也无法破坏原作者的思 ...

  8. 【NX二次开发】Block UI 超级截面

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  9. 面试官:如何在分布式场景下生成全局唯一 ID?

    在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或者用作事务版本号.分布式链路追踪等等,好的全局唯 ...

  10. AJAX异步原理与实现

    面试时问到了这个问题,说实话我还是不理解的,只是单单会使用.所以今天我看一下,自己了解下. 看了网上前辈们写的资料,我自己总结归纳ajax的原理和流程如下: 1.AJAX创建异步对象XMLHttpRe ...