在家补补题

 

模拟 A - Robot Sequence

#include <bits/stdc++.h>

char str[202];

void move(int &x, int &y, char ch)  {
if (ch == 'U') x--;
if (ch == 'D') x++;
if (ch == 'L') y--;
if (ch == 'R') y++;
} int main(void) {
int n; scanf ("%d", &n);
scanf ("%s", &str);
int ans = 0;
for (int i=0; i<n; ++i) {
int x = 0, y = 0;
for (int j=i; j<n; ++j) {
move (x, y, str[j]);
if (x == 0 && y == 0) ans++;
}
}
printf ("%d\n", ans); return 0;
}

暴力 || 找规律 B - Cards

暴力即DFS也行。。。当时就if else乱写一堆过了

#include <bits/stdc++.h>

char str[202];
int col[3]; int main(void) {
int n; scanf ("%d", &n);
scanf ("%s", &str);
col[0] = col[1] = col[2] = 0;
for (int i=0; i<n; ++i) {
if (str[i] == 'R') col[0]++;
if (str[i] == 'G') col[1]++;
if (str[i] == 'B') col[2]++;
}
if (col[0] == n) puts ("R");
else if (col[1] == n) puts ("G");
else if (col[2] == n) puts ("B");
else {
if (col[0] && col[1] && col[2]) puts ("BGR");
else {
if (n == 2) {
if (col[0] == 0) puts ("R");
else if (col[1] == 0) puts ("G");
else if (col[2] == 0) puts ("B");
}
else if (col[0] == 1) {
if (col[1] == 0) puts ("GR");
if (col[2] == 0) puts ("BR");
}
else if (col[1] == 1) {
if (col[0] == 0) puts ("GR");
if (col[2] == 0) puts ("BG");
}
else if (col[2] == 1) {
if (col[0] == 0) puts ("BR");
if (col[1] == 0) puts ("BG");
}
else puts ("BGR");
}
} return 0;
} 

暴力 C - Block Towers

直接枚举答案,同时记录能整除2,整除2和3,只能整除3的个数,当遇到满足条件的就是最优。二分也行。。

#include <bits/stdc++.h>

const int N = 4e6 + 5;

int main(void)  {
int n, m; scanf ("%d%d", &n, &m);
int best = 4000000;
int c1 = 0, c2 = 0, c3 = 0;
for (int i=2; i<=4000000; ++i) {
if (i % 2 == 0) c1++;
if (i % 2 == 0 && i % 3 == 0) c2++;
if (i % 2 != 0 && i % 3 == 0) c3++;
if (c1 >= n && c2 >= m - c3 && c1 - (m - c3) >= n) {
best = i; break;
}
}
printf ("%d\n", best); return 0;
}

暴力+概率 D - Jerry's Protest

题意:已知结果两胜一负,问总和小于后者的概率。

分析:预处理出任意两个数字相减的差的方案数,那么前两次在正数选,后者只要能使得总和小的可以处理前缀和,O (1),总复杂度 O (n ^ 2)。

#include <bits/stdc++.h>

const int N = 2e3 + 5;

int a[N];
int cnt[10005];
int sum[5005]; int main(void) {
int n; scanf ("%d", &n);
for (int i=1; i<=n; ++i) scanf ("%d", &a[i]);
for (int i=1; i<=n; ++i) {
for (int j=1; j<=n; ++j) {
if (i == j) continue;
cnt[5000+a[i]-a[j]]++;
}
}
for (int i=1; i<=5000; ++i) {
sum[i] = sum[i-1] + cnt[i];
}
double ans = 0;
for (int i=5001; i<=9999; ++i) {
if (!cnt[i]) continue;
for (int j=5001; j<=9999; ++j) {
if (!cnt[j]) continue;
int c = 15000 - (i + j) - 1;
if (c < 1 || c > 4999 || !sum[c]) continue;
ans += 1.0 * cnt[i] * cnt[j] * sum[c];
}
}
double div = 1.0 * (n * (n - 1) / 2);
ans = ans / div / div / div;
printf ("%.8f\n", ans); return 0;
}

三分 + 贪心 E - Simple Skewness

题意:选取一个子集使得平均数-中位数最大

分析:首先个数是奇数,如果是偶数,去掉中间较大的数,差会变大(?)。然后排序后,枚举中位数的位置,三分长度,因为差的分布是单峰,选的数字使差尽可能大,右边选择最后几个,左边选取靠近中位数的几个。

#include <bits/stdc++.h>

typedef long long ll;
const int N = 2e5 + 5;
struct Pair {
ll a; int b;
bool operator < (const Pair &rhs) const {
return a * rhs.b < rhs.a * b;
}
};
int a[N];
ll sum[N];
int n, bi, bl;
Pair best; Pair get(int id, int len) {
ll val = sum[id] - sum[id-len-1];
val += sum[n] - sum[n-len];
Pair cur = Pair {val, 2 * len + 1};
cur.a -= 1ll * a[id] * cur.b;
if (best < cur) {
best = cur;
bi = id; bl = len;
}
return cur;
} int main(void) {
scanf ("%d", &n);
for (int i=1; i<=n; ++i) {
scanf ("%d", a + i);
}
std::sort (a+1, a+1+n);
for (int i=1; i<=n; ++i) {
sum[i] = sum[i-1] + a[i];
}
bi = 1; bl = 0;
best = Pair {0, 1};
for (int i=1; i<=n; ++i) {
int low = 0, high = std::min (i - 1, n - i);
while (low + 3 < high) {
int mid1 = (2 * low + high) / 3;
int mid2 = (low + 2 * high) / 3;
Pair v1 = get (i, mid1);
Pair v2 = get (i, mid2);
if (v1 < v2) low = mid1;
else high = mid2;
}
for (int j=low; j<=high; ++j) get (i, j);
}
std::vector<int> ans;
for (int i=bi-bl; i<=bi; ++i) {
ans.push_back (a[i]);
}
for (int i=n-bl+1; i<=n; ++i) {
ans.push_back (a[i]);
}
printf ("%d\n", ans.size ());
for (int i=0; i<ans.size (); ++i) {
if (i > 0) putchar (' ');
printf ("%d", ans[i]);
}
puts (""); return 0;
} 

DP F - Group Projects

题意:n个数字分组,求每组最大值-最小值的和小于k的方案数

分析:明显的DP,复杂度肯定是 O (n ^ 2 * k),难在状态的转移。dp[i][j][k] 考虑前i个数字,open(只知道最小值,最大值未知)了j组,当前累计和为k的方案数。那么open的几组暂时由a[i]"托管",之前是a[i-1]“托管”,那么前后转移累加j * (a[i] - a[i-1]),a[i]有好几种选择,可以close一个组,选择一个组自己为最大值,j - 1;可以多一个组,自己为最小值,j+1;还可以进入某一个组(自己不是最大值)或者自己一个数字成为一个组(不算open)。

#include <bits/stdc++.h>

const int N = 2e2 + 5;
const int K = 1e3 + 5;
const int MOD = 1e9 + 7;
int a[N];
int dp[2][N][K]; void add(int &x, int y) {
x += y;
if (x >= MOD) x %= MOD;
} int main(void) {
int n, m; scanf ("%d%d", &n, &m);
for (int i=1; i<=n; ++i) scanf ("%d", a + i);
std::sort (a+1, a+1+n);
int now = 0;
dp[now][0][0] = 1;
for (int i=1; i<=n; ++i) {
now ^= 1;
memset (dp[now], 0, sizeof (dp[now]));
for (int j=0; j<i; ++j) {
for (int k=0; k<=m; ++k) {
if (!dp[now^1][j][k]) continue;
int &x = dp[now^1][j][k];
int s = k + j * (a[i] - a[i-1]);
if (s > m) continue;
add (dp[now][j][s], 1ll * x * (j + 1) % MOD);
add (dp[now][j+1][s], x);
if (j) add (dp[now][j-1][s], 1ll * x * j % MOD);
}
}
}
int ans = 0;
for (int i=0; i<=m; ++i) add (ans, dp[now][0][i]);
printf ("%d\n", ans); return 0;
}

  

8VC Venture Cup 2016 - Elimination Round的更多相关文章

  1. 8VC Venture Cup 2016 - Elimination Round D. Jerry's Protest 暴力

    D. Jerry's Protest 题目连接: http://www.codeforces.com/contest/626/problem/D Description Andrew and Jerr ...

  2. 8VC Venture Cup 2016 - Elimination Round (C. Block Towers)

    题目链接:http://codeforces.com/contest/626/problem/C 题意就是给你n个分别拿着2的倍数积木的小朋友和m个分别拿着3的倍数积木的小朋友,每个小朋友拿着积木的数 ...

  3. codeforces 8VC Venture Cup 2016 - Elimination Round C. Lieges of Legendre

    C. Lieges of Legendre 题意:给n,m表示有n个为2的倍数,m个为3的倍数:问这n+m个数不重复时的最大值 最小为多少? 数据:(0 ≤ n, m ≤ 1 000 000, n + ...

  4. 8VC Venture Cup 2016 - Elimination Round F - Group Projects dp好题

    F - Group Projects 题目大意:给你n个物品, 每个物品有个权值ai, 把它们分成若干组, 总消耗为每组里的最大值减最小值之和. 问你一共有多少种分组方法. 思路:感觉刚看到的时候的想 ...

  5. 8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树

    G. Raffles 题目连接: http://www.codeforces.com/contest/626/problem/G Description Johnny is at a carnival ...

  6. 8VC Venture Cup 2016 - Elimination Round F. Group Projects dp

    F. Group Projects 题目连接: http://www.codeforces.com/contest/626/problem/F Description There are n stud ...

  7. 8VC Venture Cup 2016 - Elimination Round E. Simple Skewness 暴力+二分

    E. Simple Skewness 题目连接: http://www.codeforces.com/contest/626/problem/E Description Define the simp ...

  8. 8VC Venture Cup 2016 - Elimination Round C. Block Towers 二分

    C. Block Towers 题目连接: http://www.codeforces.com/contest/626/problem/C Description Students in a clas ...

  9. 8VC Venture Cup 2016 - Elimination Round B. Cards 瞎搞

    B. Cards 题目连接: http://www.codeforces.com/contest/626/problem/B Description Catherine has a deck of n ...

随机推荐

  1. IOS-JSON & XML解析

    XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...

  2. error TRK0002

    运行程序出现error TRK0002的原因是因为3ds max中打开了程序生成的模型,同时使用导致memory conflict,然后随之出现一些乱七八糟的问题. 只要将3ds max重置即可,即不 ...

  3. ZooKeeper 配置文件(zoo.cfg)详解

    参数名 说明 clientPort 客户端连接server的端口,即对外服务端口,一般设置为2181吧. dataDir 存储快照文件snapshot的目录.默认情况下,事务日志也会存储在这里.建议同 ...

  4. Mysql之高可用

    使用缓存Memcache, 1,可使用Hash算法由客户端决定路由到哪个Memcache服务器上:客户端完全不用关心数据存储在哪个Memcache服务器上:完全隔离了客户端与服务端:由于是Hash,在 ...

  5. 隐藏<input type="file"> 实现点击div或图片打开文件选择路径

    HTML: <input type="file" style="display:none" id="addfile-btn"> ...

  6. 继承下public,protected,private访问权限

    C++中派生类对基类成员的访问形式主要有以下两种: 1.内部访问:由派生类中新增成员对基类继承来的成员的访问. 2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在 ...

  7. FastPolice项目总结

    This is the final homework for spatial information Mobile Service Lesson.It generally inclusived the ...

  8. 学习JNDI

    既然datasource对象有tomcat提供,那么我们如何在应用程序中获得它呢,tomcat把这个对象放在JNDI服务中, 并用一个名字把它关联起来,我们在应用程序中,只需通过JNDI搜索这个名字, ...

  9. 14.模板方法模式(Template Method)

    using System; namespace ConsoleApplication7 { class Program { /// <summary> /// 模板方法模式——在一个抽象类 ...

  10. android 5.1 WIFI图标上的感叹号及其解决办法

    转自:http://blog.csdn.net/w6980112/article/details/45843129 第一次调试android5.1的 WIFI更改小功能 Wifi 源码的相关路径目录  ...