Codeforces Round #247 (Div. 2) ABC

Codeforces Round #247 (Div. 2)

http://codeforces.com/contest/431

代码均已投放:https://github.com/illuz/WayToACM/tree/master/CodeForces/431


A - Black Square

题目地址

题意:

Jury玩别踩白块,游戏中有四个区域,Jury点每个区域要消耗ai的卡路里,给出踩白块的序列,问要消耗多少卡路里。

分析:

模拟水题..

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        a.cpp
*  Create Date: 2014-05-21 23:33:25
*  Descripton:
*/

#include <cstdio>
#include <iostream>
#include <string>
using namespace std;

int a[5], ans;
string s;

int main()
{
	for (int i = 1; i <= 4; i++)
		cin >> a[i];
	cin >> s;
	for (int i = 0; i < s.length(); i++)
		ans += a[s[i] - '0'];
	cout << ans << endl;
	return 0;
}

B - Shower Line

题目地址

题意:

5个学生排队,某一个排队方式的每一个情况下,第2i-1个人和第2个人会交谈。交谈时,第i和第j个人的交谈会产生g[i][j] + g[j][i]的欢乐(搞基)值,求中最大的欢乐值。

分析:

刚开始还以为人数没定,犹豫了一会...

直接用next_permutation暴力,5!是可以接受的。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        b.cpp
*  Create Date: 2014-05-21 23:43:23
*  Descripton:
*/

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 5;
char ch;
int g[N][N], mmax;
int a[5] = {0, 1, 2, 3, 4};

int main()
{
	int i = 0, j = 0;
	for (int i = 0; i < 5; i++)
		for (int j = 0; j < 5; j++)
			scanf("%d", &g[i][j]);
	for (int i = 0; i < 5; i++)
		for (int j = i + 1; j < 5; j++) {
			g[j][i] = g[i][j] = g[i][j] + g[j][i];
		}
	do {
		mmax = max(mmax, g[a[0]][a[1]] + g[a[1]][a[2]] + g[a[2]][a[3]] * 2 + g[a[3]][a[4]] * 2);
	} while (next_permutation(a, a + 5));
	cout << mmax << endl;
	return 0;
}

C - k-Tree

题目地址

题意:

一颗无限的k-tree,定义如下:

每个节点都有k个分支,第i个分支的边的权值为i。

问在k-tree中有多少条路径,里面至少有一条边权值不小于d,且路径边的和为n。

分析:

比赛时没敲出来(太弱orz),赛后发现有个地方错了...

这题可以用dp,因为是无限的树,所以根节点下来和每个节点下来是一样的,但是转移为子问题还需要一个因素,就是条件限定边必须<=d,所以我们可以再开一维存放是否需要条件限定。

具体看代码...

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        c.cpp
*  Create Date: 2014-05-22 00:20:28
*  Descripton:
*/

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;

const int N = 110;
const int MOD = 1e9 + 7;
ll D[N][2];
int n, d, k;

ll dp(int r, bool b)
{
	if (D[r][b] != -1)
		return D[r][b];
	if (r == 0)
		return D[r][b] = b;
	D[r][b] = 0;
	for (int i = 1; i <= min(r, k); i++)
		if (b || i >= d)
			D[r][b] = (D[r][b] + dp(r - i, 1)) % MOD;
		else
			D[r][b] = (D[r][b] + dp(r - i, 0)) % MOD;
	return D[r][b];
}

int main()
{
	memset(D, -1, sizeof(D));
	scanf("%d%d%d", &n, &k, &d);
	cout << dp(n, 0) << endl;
	return 0;
}

Codeforces Round #247 (Div. 2) ABC,布布扣,bubuko.com

时间: 2024-12-27 07:57:53

Codeforces Round #247 (Div. 2) ABC的相关文章

Codeforces Round #247 (Div. 2) B - Shower Line

模拟即可 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ vector<int> a(5); for(int i = 0; i < 5; ++ i) a[i] = i; int g[5][5]; for(int i = 0 ; i < 5; ++ i){ for(int j = 0 ; j < 5; ++

Codeforces Round #247 (Div. 2)

A.水题. 遍历字符串对所给的对应数字求和即可. B.简单题. 对5个编号全排列,然后计算每种情况的高兴度,取最大值. C.dp. 设dp[n][is]表示对于k-trees边和等于n时,如果is==1表示存在边至少为d的边,如果is==0表示不存在边至少为d的边. 初始状态dp[0][0]=1. //和为n且不存在至少为d的边的状态可以由所有不存在至少为d的边加一条小于d的边转移而来. dp[n][0]=dp[n-1][0]+dp[n-2][0]+--+dp[n-(d-1)][0] //和为n

Codeforces Round #366 (Div. 2) ABC

Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 1 #I hate that I love that I hate it 2 n = int(raw_input()) 3 s = "" 4 a = ["I hate that ","I love that ", "I hate it","I love it"] 5 fo

Codeforces Round #247 (Div. 2) C. k-Tree

题目链接:http://codeforces.com/problemset/problem/431/C 题意:给一个k-tree,每个节点有k个儿子,然后边权从左到右依次为1-k,给定n, k, d, 求至少有一条边权值>=d然后总和是n有多少种方法 题解:dp[i][j][0]表示当前到第i层,和为j,没有超过d的边权的方法数,dp[i][j][1]表示当前到第i层,和为j,有超过d的边权的方法数. #include <cstdio> #include <cstring>

Codeforces Round #451 (Div. 2) ABC

A. Rounding Vasya has a non-negative integer n. He wants to round it to nearest integer, which ends up with 0. If n already ends up with 0, Vasya considers it already rounded. For example, if n = 4722 answer is 4720. If n = 5 Vasya can round it to 0 

Codeforces Round #312 (Div. 2) ABC题解

[比赛链接]click here~~ A. Lala Land and Apple Trees: [题意]: AMR住在拉拉土地.拉拉土地是一个非常美丽的国家,位于坐标线.拉拉土地是与著名的苹果树越来越随处可见. 拉拉土地恰好n苹果树.树数i位于位置xi和具有人工智能的苹果就可以了增长.阿姆鲁希望从苹果树收集苹果. AMR目前维持在X =0的位置.在开始的时候,他可以选择是否去左边或右边.他会在他的方向继续下去,直到他遇见一棵苹果树,他之前没有参观.他会采取所有的苹果,然后扭转他的方向,继续走这

Codeforces Round #429 (Div. 2)ABC

A: 题意:n个东西,k个朋友,全部给朋友,每个朋友不可以拿同样的,问是否可行 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 map<char ,int >ma; 5 int main(){ 6 int n,k; 7 cin>>n>>k; 8 string s; 9 cin>>s; 10 for(int i=0;i<n;i++){ 11 ma[s[i]]++; 12 if(ma[s

Codeforces Round #247 (Div. 2) C. k-Tree (dp)

题目链接 题意: 思路: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 const int mo = 1000000000 + 7; 8 int dp[110][110][110]; 9 10 int main() 11 { 12

Codeforces Round #247 (Div. 2) C D

这题是一个背包问题 这样的 在一个k子树上 每个节点都有自己的k个孩子 然后 从原点走 走到 某个点的 和为 N 且每条的 长度不小于D 就暂停问这样的 路有多少条,  呵呵 想到了 这样做没有把他敲出来,可以很清楚的 到达第几层都能到达那些状态 然后 最多N层看看每层取到什么样的值 然后先算出没有任何限制 的路有多少条 接着用权值小于D的路径做看能够搞多少条 然后相减一下就好了 #include <cstdio> #include <string.h> #include <