Codeforces Round #302 (Div. 2)
A. Set of Strings
题意:能否把一个字符串划分为n段,且每段第一个字母都不相同?
思路:判断字符串中出现的字符种数,然后划分即可。
#include<iostream>
#include<set>
#include<cstdio>
#include<cstring>
using namespace std;
char s[];
set<char>st;
int main()
{
int n;
scanf("%d%s", &n,s);
int len = strlen(s);
for (int i = ; i < len; i++)
{
if (!st.count(s[i]))st.insert(s[i]);
}
if (st.size() < n) printf("NO\n");
else
{
st.clear();
printf("YES\n");
int cur = ;
while (n--)
{
st.insert(s[cur]);
while (cur<len&&st.count(s[cur]))
{
printf("%c", s[cur++]);
}
if (n == )
{
while(cur<len) printf("%c", s[cur++]);
}
printf("\n");
}
}
return ;
}
B. Sea and Islands
题意:n*n的网格里都是水,现在需要填沙造出k个陆地,两两之间有边相邻的看成一片陆地。
思路:讨论奇偶。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n, k;
scanf("%d%d", &n, &k);
int maxs = n / * n + n % * (n + ) / ;
if (k > maxs)printf("NO\n");
else
{
printf("YES\n");
for (int i = ; i < n; i++)
{
int st;
if (i % ==) st = ;
else st = ;
for (int j=; j < n; j++)
{
if ((j - st) % == &&k>) printf("L"),k--;
else printf("S");
}
printf("\n");
}
}
return ;
}
C. Writing Code
题意:有n个程序员,现在需要合作完成m行的代码,要求最多只有b个bug,求总方案数?
思路:dp[i][j][k]:表示前i个程序员一起写j行代码bug数为k的方案数.采用滚动数组优化。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = ;
const int maxm = ;
const int maxb = ;
int dp[][maxm][maxb];//[i][j][k]表示前i个程序员一起写j行代码bug数为k的方案数
int bugs[maxn];
int main()
{
int n, m, b, mod;
scanf("%d%d%d%d", &n, &m, &b, &mod);
for (int i = ; i <= n; i++) scanf("%d", bugs + i);
dp[][][] = dp[][][] = ;
int pre, now;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= m; j++)
{
for (int k =; k <= b; k++)
{
pre = ((i - ) & ),now=(i&);
if (k >= bugs[i]) dp[now][j][k] = (dp[pre][j][k] + dp[now][j - ][k - bugs[i]]) % mod;
else dp[now][j][k] = dp[pre][j][k];
}
}
}
int ans = ;
for (int i = ; i <= b; i++) ans = (ans + dp[now][m][i]) % mod;
printf("%d\n",ans);
return ;
}
D. Destroying Roads
题意:有n个点,m条无向边。在保证s1到t1不超过l1小时、s2到t2不超过l2小时(每走一条边花费1小时)的情况下,求最多可以删去多少条边?
思路:求出每两点之间的最短距离,然后2层循环枚举重复的路径。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = ;
struct edge
{
int next, to;
edge(int tt=,int nn=):to(tt),next(nn){}
};
edge Edge[maxn*maxn];
int Head[maxn], totedge;
void addedge(int from, int to)
{
Edge[totedge] = edge(to, Head[from]);
Head[from] = totedge++;
Edge[totedge] = edge(from, Head[to]);
Head[to] = totedge++;
}
int dis[maxn][maxn];
bool vis[maxn];
const int INF = 0x3f3f3f3f;
int n, m;
void SPFA(int st)
{
for (int i = ; i <= n; i++) dis[st][i] = INF;
dis[st][st] = ;
vis[st] = true;
queue<int>q;
q.push(st);
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for (int i = Head[u]; i != -; i = Edge[i].next)
{
int v = Edge[i].to;
if (dis[st][v] > dis[st][u] + )
{
dis[st][v] = dis[st][u] + ;
if (!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
}
int main()
{
scanf("%d%d", &n, &m);
memset(Head, -, sizeof(Head));
totedge = ;
for (int i = ; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
}
int s1, d1, l1, s2, d2, l2;
scanf("%d%d%d%d%d%d", &s1, &d1, &l1, &s2, &d2, &l2);
for (int i = ; i <= n; i++) SPFA(i);
if (dis[s1][d1] > l1 || dis[s2][d2] > l2) printf("-1\n");
else
{
int minnum = dis[s1][d1] + dis[s2][d2];
for (int i = ; i <= n; i++)
{
for (int j = ; j <= i; j++)
{
if (dis[s1][i] + dis[i][j] + dis[j][d1] <= l1 && dis[s2][i] + dis[i][j] + dis[j][d2] <= l2)
{
minnum = min(minnum, dis[s1][i] + dis[i][j] + dis[j][d1] + dis[s2][i] + dis[j][d2]);
}
if (dis[s1][i] + dis[i][j] + dis[j][d1] <= l1 && dis[s2][j] + dis[j][i] + dis[i][d2] <= l2)
{
minnum = min(minnum, dis[s1][i] + dis[i][j] + dis[j][d1] + dis[s2][j] + dis[i][d2]);
}
if (dis[s1][j] + dis[j][i] + dis[i][d1] <= l1 && dis[s2][i] + dis[i][j] + dis[j][d2] <= l2)
{
minnum = min(minnum, dis[s1][j] + dis[j][i] + dis[i][d1] + dis[s2][i] + dis[j][d2]);
}
if (dis[s1][j] + dis[j][i] + dis[i][d1] <= l1 && dis[s2][j] + dis[j][i] + dis[i][d2] <= l2)
{
minnum = min(minnum, dis[s1][j] + dis[j][i] + dis[i][d1] + dis[s2][j] + dis[i][d2]);
}
}
}
printf("%d\n", m - minnum);
}
return ;
}
E. Remembering Strings
题意:有n个字符串,每个字符串m位,要使得每个字符串存在一个位置i上的字符唯一(其他字符串该位上的字符与该字符串不同,称为易记字符串),你可以将某个字符串某位替换成任意字符,给出每个字符串每位替换的代价,求最小代价?
思路:将n个字符串各自是否为易记标记为0/1,则我们可以进行状态压缩,对每个当前的状态,找到最低位的0(表示该字符串进行转换,其余高位的0无需转换),按照以下策略进行替换:如果该位唯一,则dp[i | (1 << j)] = dp[i],否则考虑2种方案:第一种方案,直接让该位字符唯一——dp[i | (1 << j)] = min(dp[i | (1 << j)], dp[i] + cost[j][k]);第二种方案,找到所有和该字符串该位字符一样的所有字符串,除去代价最大的,其他字符串进行转换——dp[i | tmp] = min(dp[i | tmp], dp[i] + sumc - maxc)。
初始化为-1时需要考虑当前状态在此前是否已被转换到,没有则跳过;初始化为INF则不用考虑。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char str[][];
int cost[][];
const int maxc = << ;//最大状态数
int dp[maxc];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++) scanf("%s", str + i);
for (int i = ; i < n; i++)
{
for (int j = ; j < m; j++) scanf("%d", &cost[i][j]);
}
int total = ( << n) - ;//最终状态为111...11,n个1表示n个字符串都为易记
memset(dp, -, sizeof(dp));
dp[] = ;
for (int i = ; i <total; i++)//枚举状态
{
if (dp[i] == -) continue;//该状态没有被转移到,跳过
int j = ;
while (((i >> j) & ) == ) j++;//找到该状态中为非易记的字符串进行状态转移
for (int k = ; k < m; k++)
{//让该字符串第k位的字符唯一
int cnt = , sumc = , maxc = , tmp = ;
for (int z = ; z < n; z++)
{
if (str[z][k] == str[j][k])
{
cnt++;
sumc += cost[z][k];//总代价
maxc = max(maxc, cost[z][k]);//最大代价
tmp |= ( << z);//所有和该字符串该位一样的字符串为易记时的状态
}
}
if (cnt == )//如果该位字符本就唯一
{
if (dp[i | ( << j)] == -)dp[i | ( << j)] = dp[i];
else dp[i | ( << j)] = min(dp[i | ( << j)], dp[i]);
}
else//否则
{
//第一种方案,直接让该位字符唯一
if (dp[i | ( << j)] == -) dp[i | ( << j)] = dp[i] + cost[j][k];
else dp[i | ( << j)] = min(dp[i | ( << j)], dp[i] + cost[j][k]);
//第二种方案,找到所有和该字符串该位字符一样的所有字符串,除去代价最大的,其他字符串进行转换
if (dp[i | tmp] == -) dp[i | tmp] = dp[i] + sumc - maxc;
else dp[i | tmp] = min(dp[i | tmp], dp[i] + sumc - maxc);
}
}
}
printf("%d\n", dp[total]);
return ;
}
Codeforces Round #302 (Div. 2)的更多相关文章
- 完全背包 Codeforces Round #302 (Div. 2) C Writing Code
		
题目传送门 /* 题意:n个程序员,每个人每行写a[i]个bug,现在写m行,最多出现b个bug,问可能的方案有几个 完全背包:dp[i][j][k] 表示i个人,j行,k个bug dp[0][0][ ...
 - 构造 Codeforces Round #302 (Div. 2) B Sea and Islands
		
题目传送门 /* 题意:在n^n的海洋里是否有k块陆地 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 输出完k个L后,之后全部输出S:) 5 10 的例子可以是这样的: LSLS ...
 - 水题 Codeforces Round #302 (Div. 2) A Set of Strings
		
题目传送门 /* 题意:一个字符串分割成k段,每段开头字母不相同 水题:记录每个字母出现的次数,每一次分割把首字母的次数降为0,最后一段直接全部输出 */ #include <cstdio> ...
 - Codeforces Round #302 (Div. 1) C. Remembering Strings DP
		
C. Remembering Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...
 - Codeforces Round #302 (Div. 2) D - Destroying Roads 图论,最短路
		
D - Destroying Roads Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544 ...
 - Codeforces Round #302 (Div. 2) C. Writing Code 简单dp
		
C. Writing Code Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/prob ...
 - Codeforces Round #302 (Div. 2) B. Sea and Islands 构造
		
B. Sea and Islands Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/p ...
 - Codeforces Round #302 (Div. 2) A. Set of Strings 水题
		
A. Set of Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/pr ...
 - Codeforces Round #302 (Div. 1) 训练
		
链接: http://codeforces.com/contest/543 过程: 惨淡的只做出了A和C 题解: A 题解: 简单的一道题 我们用$dp[i][j]$表示当前考虑到前num个人(这个另 ...
 - Codeforces Round #302 (Div. 2).C. Writing Code (dp)
		
C. Writing Code time limit per test 3 seconds memory limit per test 256 megabytes input standard inp ...
 
随机推荐
- 打开.py文件的方法
			
用IDLE打开这个文件,然后按F5,系统就自动开始运行这个python程序,然后当前运行目录就跳转到这个目录了
 - WCF系列 Restful WCF
			
由于项目需要,需要完成移动端与服务端以json格式的数据交互,所以研究了Restful WCF相关内容,以实现ios端,android端与浏览器端能够与后台服务交互. 那么首先我们来了解下什么是Res ...
 - 【BZOJ】3016: [Usaco2012 Nov]Clumsy Cows(贪心)
			
http://www.lydsy.com/JudgeOnline/problem.php?id=3016 之前yy了一个贪心,,,但是错了,,就是枚举前后对应的字符(前面第i个和后面第i个)然后相同答 ...
 - Openstack(Kilo)安装系列之nova(八)
			
计算节点 To install and configure the Compute hypervisor components 1.Install the packages: yum install ...
 - hbase0.96.0单机模式安装(win7 无需cygwin)
			
之前折腾了几天,想让hbase的单机模式在cygwin上跑起来,都不成功.正当我气馁之时,我无意中发现hbase0.96.0的bin和conf目录下有一些扩展名为cmd的文件.这难道是给win ...
 - 终于找到了最新的Chemdarw注册码
			
随着中国人对知识产权的保护意识提升,正版软件越来越流行,只有一小部分人还在寻找Chemdarw破解版.最新的ChemDraw 15正式版本已经强势来袭,在获取软件安装包之后需要有效的注册码才能激活软件 ...
 - SurvivalShooter学习笔记(二.玩家移动旋转)
			
该案例中:(PC端操作) 1.玩家移动输入控制通过虚拟轴Axis,旋转输入控制通过鼠标位置: 2.玩家始终面朝鼠标停留点,鼠标停留点通过摄像机朝地面的射线获取: 3.玩家待机移动状态切换通过Anima ...
 - bzoj 1415(概率dp和bfs预处理)
			
感觉挺经典的一道题目. 先用 bfs 预处理下一步走到的位置.因为每一步走法都是固定的,所以可以用dp的方法来做. 1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec M ...
 - 酷壳用的还是 Wordpress
			
WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. http: ...
 - 【BZOJ4380】[POI2015]Myjnie 区间DP
			
[BZOJ4380][POI2015]Myjnie Description 有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i].有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[ ...