idea key is invalid解法

该文章已生成可运行项目,
本文章已经生成可运行项目
c++14 # P14725 [ICPC 2022 Seoul R] Folding Stick ## 题目描述 有一根可折叠的棍子,由 $n$ 段长度为正的节段组成。节段之间通过铰链(可伸缩的细绳)连接,允许每段在铰链处折叠 $180$ 度。**缠绕长度** 是指棍子在一个或多个铰链处折叠后折叠部分的长度。根据折叠策略的不同,缠绕长度可能不同。 你需要在以下折叠方式的条件下找到最小的缠绕长度:首先,将棍子的各节段沿水平线放置。然后,从左到右顺时针折叠棍子。在折叠过程中,每个铰链左侧所连接的节段要么顺时针旋转 $180$ 度,要么完全不旋转。 例如,下图展示了一根四节段的棍子,节段长度总和为 $10$。图中,从左到右各节段的长度分别为 $3$、$2$、$2$ 和 $3$,铰链标记为 ①、②、③。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/vsm99tzh.png) ::: 在此例中,棍子不能在铰链 ① 和 ② 处同时折叠。这是因为如果先在铰链 ① 处折叠,再在铰链 ② 处折叠,经过铰链 ② 的长度为 $3$ 的节段将被折断。如果仅在铰链 ② 处折叠,缠绕长度为 $5$。如果依次在铰链 ① 和 ③ 处折叠,缠绕长度为 $4$,如下图所示。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/96ppywpi.png) ::: 给定一根可折叠棍子的节段长度序列,请编写程序输出该棍子的最小缠绕长度。 ## 输入格式 你的程序需要从标准输入读取数据。输入的第一行包含一个整数 $n$ ($2 \leq n \leq 100,000$),其中 $n$ 是可折叠棍子的节段数。第二行包含 $n$ 个正整数,表示从棍子最左端到最右端的节段长度序列。每段长度不超过 $20,000$。 ## 输出格式 你的程序需要向标准输出写入数据。输出恰好一行。该行应包含一个正整数,表示最小缠绕长度。 ## 输入输出样例 #1 ### 输入 #1 ``` 4 3 2 2 3 ``` ### 输出 #1 ``` 4 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 5 1 1 1 1 1 ``` ### 输出 #2 ``` 1 ``` ## 输入输出样例 #3 ### 输入 #3 ``` 7 1 3 2 3 4 2 2 ``` ### 输出 #3 ``` 6 ```
最新发布
12-14
# CF1225E Rock Is Push ## 题目描述 你现在在一个$n×m$的迷宫的左上角(即点$(1,1)$),你的目标是到达迷宫的右下角(即点$(n,m)$)。一次移动你只能向右或者是向下移动一个单位。比如在点$(x,y)$你可以移动到点$(x+1,y)$或点$(x,y+1)$ 迷宫中的一些点是岩石,当你移动到一个有岩石的点时岩石将被推到你移动方向的下一个点(你可以把岩石想象成推箱子游戏中的箱子),而如果那个点上也有一个岩石,它就会被按相同方向推的更远,以此类推(比如当前点右边有连着的十块岩石,你向右走一个点这些岩石就都会被向右推一个点) 这个迷宫被不可移动或是摧毁的墙包围着,石头是不允许被推到墙外或者摧毁墙的。(比如你右边有一个石头,而再往右是墙,你就不能往右移动了) 现在,请你计算出有多少种不同的可以到达终点的方案,由于方案数可能很大,结果请对$10^9+7$取模。两条路径中如果有任意的至少一个点不同,那就认为这两种方案是不同的。 ## 输入格式 输入第一行是两个正整数$n,m$,表示迷宫的长和宽$(1≤n,m≤2000)$ 然后有$n$行,每行$m$个字符,如果第$i$行的第$j$个字符是"$R$",那就说明点$(i,j)$存在一块岩石,如果是".",那就说明点$(i,j)$是空的 数据保证出发点$(1,1)$一定是空的 ## 输出格式 输出一个整数,表示从$(1,1)$走到$(n,m)$的方案数对$10^9+7$取模的结果。 ## 输入输出样例 #1 ### 输入 #1 ``` 1 1 . ``` ### 输出 #1 ``` 1 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 2 3 ... ..R ``` ### 输出 #2 ``` 0 ``` ## 输入输出样例 #3 ### 输入 #3 ``` 4 4 ...R .RR. .RR. R... ``` ### 输出 #3 ``` 4 ``` ## 说明/提示 第一个样例中,不需要移动就能到达终点,所以只有一种路径方案,输出$1$ 第二个样例中终点被岩石挡住了,无法到达,所以没有方案可以到达终点,输出$0$ 点击本网址可以看到第三个样例的例图 https://assets.codeforces.com/rounds/1225/index.html #include<bits/stdc++.h> #define md 1000000007 #define int long long using namespace std; int f[2005][2005][2];//0向下,1向右 bool isst[2005][2005]; int xy[2005][2005];//从当前格子右边到边界有多少个空格,不包括当前格子 int xx[2005][2005]; int n,m; main() { // freopen("test.txt","r",stdin); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m;//n 行,m 列 for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { char c; cin>>c; if(c=='R') isst[i][j]=1;//第 i 行,第 j 列 } } for(int i=1; i<=n; i++) { for(int j=m-1; j>=1; j--) { xy[i][j]=xy[i][j+1]+1-isst[i][j+1]; } } for(int i=n-1; i>=1; i--) { for(int j=1; j<=m; j++) { xx[i][j]=xx[i+1][j]+1-isst[i+1][j]; } } f[1][1][0]=f[1][1][1]=1; for(int i=1; i<=n; i++) {//0向下,1向右 for(int j=1; j<=m; j++) { if(i==1&&j==1) continue; if(isst[i][j]==0) { f[i][j][0]=f[i-1][j][0]+f[i-1][j][1]; f[i][j][1]=f[i][j-1][1]+f[i][j-1][0]; } else { if(xy[i][j]==0) { f[i][j][1]=0; if(xx[i][j]==0) f[i][j][0]=0; else if(xx[i][j]==1) { if(isst[i][j-1]==1) f[i][j][0]=0; else f[i][j][0]+=f[i][j-1][0]+f[i][j-1][1]; } else f[i][j][0]+=f[i][j-1][0]+f[i][j-1][1]; } else if(xy[i][j]==1) { if(isst[i][j-1]==1) f[i][j][1]=f[i][j-1][0]; else f[i][j][1]+=f[i][j-1][1]+f[i][j-1][0]; if(xx[i][j]==0) f[i][j][0]=0; else if(xx[i][j]==1) { if(isst[i-1][j]==1) f[i][j][0]=0; else f[i][j][0]+=f[i-1][j][0]+f[i-1][j][1]; } else f[i][j][0]+=f[i-1][j][0]+f[i-1][j][1]; } else { f[i][j][1]=f[i][j-1][0]+f[i][j-1][1]; if(xx[i][j]==0) f[i][j][0]=0; else if(xx[i][j]==1) { if(isst[i-1][j]==1) f[i][j][0]=0; else f[i][j][0]+=f[i-1][j][0]+f[i-1][j][1]; } else f[i][j][0]+=f[i-1][j][0]+f[i-1][j][1]; } } f[i][j][1]%=md; f[i][j][0]%=md; } } cout<<(f[n][m][0]+f[n][m][1])/2%md; }
08-30
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值