题目链接: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,,一直不知道哪里错了,看了别人博客后才发现那样是错的,如果那样做的话,对于这个样例是过不了的:

4 3 2
2 1
1..
1..
..2
...
如果那样做可能会输出9 3,而正确答案是10 2。
正确做法应该是每次将第一个队列相同编号的城堡压入到第二个队列,然后再对第二个队列进行bfs,这样就不会出现上面那种情况了
代码:
#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相关推荐

  1. Codeforces Round #533 (Div. 2)题解

    link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...

  2. Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

    Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...

  3. 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 ...

  4. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  5. Codeforces Round #374 (Div. 2) C. Journey DP

    C. Journey 题目连接: http://codeforces.com/contest/721/problem/C Description Recently Irina arrived to o ...

  6. Codeforces Round #260 (Div. 1) A - Boredom DP

    点击打开链接 题意: 给你n个数,你每次可以选择删除去一个数x,但是等于x+1和等于x-1的数都得删去 你每一次操作可以得x分 思路一: dp[i]表示到i后能够得到的最大分数 dp[i]=max(d ...

  7. Codeforces Round #387 (Div. 2) 747F(数位DP)

    题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L ...

  8. 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 以内都满足 思路 ...

  9. Codeforces Round #143 (Div. 2) (ABCD 思维场)

    题目连链接:http://codeforces.com/contest/231 A. Team time limit per test:2 seconds memory limit per test: ...

最新文章

  1. MOBA项目问题记录
  2. 使用php和json实现html页面,php – 将HTML放在JSON中
  3. 爱可可推荐!关于竞赛思路,方法和代码实践,数据竞赛Baseline开源分享!
  4. 数据结构与算法 | 斐波那契查找
  5. oracle-day1
  6. Watchman 的安装
  7. 20172329《程序设计与数据结构》实验一:线性结构实验报告
  8. Silverlight的依赖属性与附加属性(四)
  9. NPAPI确实不安全,因为功能太强大
  10. 谈谈计算机软件开发技术
  11. 用python画蜡笔小新的步骤_蜡笔小新 - python代码库 - 云代码
  12. v全球与中国男士西装市场经营规模分析与投资前景研究报告2022年版
  13. Windows10 错误代码:0xc000007b 问题解决
  14. 腾讯 美团 百度 网易游戏 2015校园招聘南京笔试面试之总结分析
  15. 前端期末大作业 HTML+CSS 动漫主题网页作业 (1)
  16. Bandit:一款Python代码安全漏洞检测工具
  17. 视频编辑SDK,AE模版SDK,绿幕抠图SDK,AI人像分割SDK,VLOG模版SDK
  18. FATE —— 二.3.2 Hetero-NN使用CustModel设置顶部、底部模型
  19. C# 右键菜单注册表改写
  20. 毛球科技论述区块链之符号理论(下)

热门文章

  1. 如果我是博客园的产品经理【上】
  2. ruby中正则表达式最小匹配与最大匹配
  3. CreateRemoteThread函数
  4. Unity AI副总裁Danny Lange:如何用AI助推游戏行业?
  5. 『协议』XML-RPC 协议规格说明
  6. C Primer Plus 第7章 C控制语句:分支和跳转 7.4 一个统计字数的程序
  7. 注册Tomcat服务为系统服务
  8. 一步步学习javascript基础篇(8):细说事件
  9. ios 开发日记 21 -自动处理键盘事件的第三方库:IQKeyboardManager
  10. PostgreSQL建表动作分析