Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105
C. Ayoub and Lost Array
题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全部元素的和可以被3整除,问有多少种方法构建出该数组。答案模1000000007
例
2 1 3
3 note:满足的情况只有[1,2],[2,1],[3,3]
解题思路:用dp[i][j]表示长度为i的数组,元素大小在[L,R]之间,并且元素和模3的余数为j的方案数,我们可以计算出[L,R]范围内模3余0\1\2的数的个数,分别设为num0,num1,num2, 我们可以很容易知道dp[1][0]=num0,dp[1][1]=num1,dp[1][2]=num2,而dp[2][0]需要分情况,当前1个数和模3余0时,第2个数便只能放模3余0的数,即有dp[1][0]*num0种;当前1个数和模3余1时,第2个数便只能放模3余2的数,即有dp[1][1]*num2种;当前1个数和模3余2时,第2个数便只能放模3余1的数,即有dp[1][2]*num1种。dp[n][0]即为我们要求的答案。
于是我们便可以得出递推式:
dp[i][0]=((dp[i-1][0]*num0%mod+dp[i-1][1]*num2%mod)%mod+dp[i-1][2]*num1%mod)%mod;
dp[i][1]=((dp[i-1][0]*num1%mod+dp[i-1][1]*num0%mod)%mod+dp[i-1][2]*num2%mod)%mod;
dp[i][2]=((dp[i-1][0]*num2%mod+dp[i-1][1]*num1%mod)%mod+dp[i-1][2]*num0%mod)%mod;
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<set> #include<cmath> #include<list> #include<deque> #include<cstdlib> #include<bitset> #include<stack> #include<map> #include<queue> using namespace std; typedef long long ll; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1] const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const double eps=1e-6; const ll mod=1e9+7; const int maxn=100005; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll lcm(ll a,ll b){return a/gcd(a,b)*b;} ll dp[2000005][5]; ll n,l,r; int main() {ios::sync_with_stdio(false); cin.tie(0);cin>>n>>l>>r;ll num0=r/3-(l-1)/3;ll num1=num0;ll num2=num0;int i,j;for(i=l;i<=r;i++){if(i%3==0)break;else if(i%3==1)num1++;else num2++;}for(j=r;j>=i;j--){if(j%3==2)break;else if(j%3==1){num2--; break;}else if(j%3==0){num1--; num2--;break;}}dp[1][0]=num0; dp[1][1]=num1; dp[1][2]=num2;for(int i=2;i<=n;i++){dp[i][0]=((dp[i-1][0]*num0%mod+dp[i-1][1]*num2%mod)%mod+dp[i-1][2]*num1%mod)%mod;dp[i][1]=((dp[i-1][0]*num1%mod+dp[i-1][1]*num0%mod)%mod+dp[i-1][2]*num2%mod)%mod;dp[i][2]=((dp[i-1][0]*num2%mod+dp[i-1][1]*num1%mod)%mod+dp[i-1][2]*num0%mod)%mod;}cout<<dp[n][0]<<endl;return 0; }
D. Kilani and the Game
题目大意:给出一个n*m的地图,最多9个人,每个人至少含有一个城堡,同时有每个人的扩张速度,即可以连续扩张的次数,现在从1-n轮流从各自的城堡开始扩张,不可通过障碍,求整个地图被扩张完成后,各个人所占领城堡的数目。
Examples
input
3 3 2
1 1
1..
...
..2
output
6 3
解题思路:开始就是想bfs嵌套,先把每一个玩家从1-n的城堡压入第一个队列,再每次把第一个队列的第一个元素弹出,压入第二个队列继续进行bfs,,一直不知道哪里错了,看了别人博客后才发现那样是错的,如果那样做的话,对于这个样例是过不了的:
2 1
1..
1..
..2
...
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<set> #include<cmath> #include<list> #include<deque> #include<cstdlib> #include<bitset> #include<stack> #include<map> #include<queue> using namespace std; typedef long long ll; #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define pushup() tree[rt]=tree[rt<<1]+tree[rt<<1|1] const int INF=0x3f3f3f3f; const double PI=acos(-1.0); const double eps=1e-6; const ll mod=1e9+7; const int maxn=100005; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll lcm(ll a,ll b){return a/gcd(a,b)*b;} const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct node{int x,y,id;node(int a,int b,int c):x(a),y(b),id(c){} }; struct node1{int x,y,id,steps;node1(int a,int b,int c,int d):x(a),y(b),id(c),steps(d){} }; int n,m,sump,s[10]; vector<node> p[10]; char mp[1050][1050]; queue<node> que; queue<node1> que1; void BFS() {while(que.size()){node tmp=que.front();int id=tmp.id;que1.push(node1(tmp.x,tmp.y,tmp.id,0));while(que.size()&&que.front().id==id) //判断第一个队列元素是否为当前压入队列是同一个玩家 {que1.push(node1(que.front().x,que.front().y,que.front().id,0));que.pop();}while(que1.size()){node1 now=que1.front();que1.pop();if(now.steps==s[now.id]){que.push(node(now.x,now.y,now.id)); //走到最后一步继续压入第一个队列continue;}for(int i=0;i<4;i++){int dx=now.x+dir[i][0];int dy=now.y+dir[i][1];if(dx>=0&&dx<n&&dy>=0&&dy<m&&mp[dx][dy]=='.'){mp[dx][dy]='0'+now.id;que1.push(node1(dx,dy,now.id,now.steps+1));}}}} } int main() {ios::sync_with_stdio(false); cin.tie(0);cin>>n>>m>>sump;for(int i=1;i<=sump;i++) cin>>s[i];for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>mp[i][j];if(mp[i][j]>='0'&&mp[i][j]<='9')p[mp[i][j]-'0'].push_back(node(i,j,mp[i][j]-'0')); //同一个玩家的城堡压入同一个向量里 }}for(int i=1;i<=sump;i++)for(int j=0;j<p[i].size();j++)que.push(p[i][j]);BFS();int ans[10];memset(ans,0,sizeof(ans));for(int i=0;i<n;i++)for(int j=0;j<m;j++)for(int k=1;k<=sump;k++)if(mp[i][j]==(k+'0'))ans[k]++;cout<<ans[1];for(int i=2;i<=sump;i++)cout<<" "<<ans[i];cout<<endl;return 0; }
转载于:https://www.cnblogs.com/zjl192628928/p/10303329.html
Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS相关推荐
- Codeforces Round #533 (Div. 2)题解
link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...
- Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...
- Codeforces Round #533 (Div. 2) 部分题解A~D
A. Salem and Sticks 题目描述 Salem gave you n n n sticks with integer positive lengths a1,a2,-,an a_1, a ...
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
- Codeforces Round #374 (Div. 2) C. Journey DP
C. Journey 题目连接: http://codeforces.com/contest/721/problem/C Description Recently Irina arrived to o ...
- Codeforces Round #260 (Div. 1) A - Boredom DP
点击打开链接 题意: 给你n个数,你每次可以选择删除去一个数x,但是等于x+1和等于x-1的数都得删去 你每一次操作可以得x分 思路一: dp[i]表示到i后能够得到的最大分数 dp[i]=max(d ...
- Codeforces Round #387 (Div. 2) 747F(数位DP)
题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L ...
- Codeforces Round #533(Div. 2) A.Salem and Sticks
链接:https://codeforces.com/contest/1105/problem/A 题意: 给n个数,找到一个数t使i(1-n)∑|ai-t| 最小. ai-t 差距1 以内都满足 思路 ...
- Codeforces Round #143 (Div. 2) (ABCD 思维场)
题目连链接:http://codeforces.com/contest/231 A. Team time limit per test:2 seconds memory limit per test: ...
最新文章
- MOBA项目问题记录
- 使用php和json实现html页面,php – 将HTML放在JSON中
- 爱可可推荐!关于竞赛思路,方法和代码实践,数据竞赛Baseline开源分享!
- 数据结构与算法 | 斐波那契查找
- oracle-day1
- Watchman 的安装
- 20172329《程序设计与数据结构》实验一:线性结构实验报告
- Silverlight的依赖属性与附加属性(四)
- NPAPI确实不安全,因为功能太强大
- 谈谈计算机软件开发技术
- 用python画蜡笔小新的步骤_蜡笔小新 - python代码库 - 云代码
- v全球与中国男士西装市场经营规模分析与投资前景研究报告2022年版
- Windows10 错误代码:0xc000007b 问题解决
- 腾讯 美团 百度 网易游戏 2015校园招聘南京笔试面试之总结分析
- 前端期末大作业 HTML+CSS 动漫主题网页作业 (1)
- Bandit:一款Python代码安全漏洞检测工具
- 视频编辑SDK,AE模版SDK,绿幕抠图SDK,AI人像分割SDK,VLOG模版SDK
- FATE —— 二.3.2 Hetero-NN使用CustModel设置顶部、底部模型
- C# 右键菜单注册表改写
- 毛球科技论述区块链之符号理论(下)