赛后补了几道

赛中我就写了两个...

A - Altruistic AmphibiansGym - 101933A

看了眼榜没几个人做。就没看。

最后发现就是一个DP(但是我觉得复杂度有点迷)

题意:$n$只青蛙有参数$l,w,h$分别表示弹跳力,体重,身高,在一口深为$d$的井里

一只青蛙不能承受比他重的重量,问最多有多少只能出去(达到高度严格大于d)

重的肯定比轻的晚出去,那么轻的肯定由重的来转移,所以先排序,从重到轻的排

$dp_{i}$表示体重为i最高能叠多高 瞎jb转移一下就好了

#include <cstdio>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ''; ch = getchar(); }
return x * f;
} const int N = 1e5 + ;
const int M = 1e8 + ;
struct P {
int l, w, h;
bool operator < (const P &rhs) const {
return w > rhs.w;
}
} p[N];
int dp[M], n, d, ans; int main() {
n = read(), d = read();
for (int i = ; i <= n; i++) p[i].l = read(), p[i].w = read(), p[i].h = read();
ans = ;
sort(p + , p + n + );
for (int i = ; i <= n; i++) {
if (dp[p[i].w] + p[i].l > d) ans++;
for (int j = p[i].w + ; j < min(p[i].w * , M); j++) {
dp[j - p[i].w] = max(dp[j-p[i].w], dp[j] + p[i].h);
}
}
printf("%d\n", ans);
return ;
}

B - Baby Bites Gym - 101933B

#include <cstdio>
#include <cstring>
using namespace std; const int N = ;
int a[N];
int n;
char s[N]; int main() {
scanf("%d", &n);
bool ans = true;
for (int i = ; i <= n; i++) {
scanf("%s", s);
int len = strlen(s);
if (s[] == 'm') a[i] = i;
else {
int x = ;
for (int j = ; j < len; j++) x = x * + s[j] - '';
a[i] = x;
if (x != i) {
ans = false;
}
}
}
puts(ans?"makes sense":"something is fishy");
return ;
}

C - Code Cleanups Gym - 101933C

阅读理解题啊。自己瞎糊了一发。读不下去。就丢给队友了。

不管了。

E - Explosion Exploit Gym - 101933E

题意:分别有$n,m$个士兵,每个士兵有一个血量,有d个攻击,等概率分给每一个士兵。

问敌方士兵全死(m)的概率是多少

队友过的。学习了新知识,概率记忆化+状压

用一个long long来表示状态

unordered_map来存状态对应的概率 再回溯搜索即可 tql

#include <bits/stdc++.h>
#define ll long long
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ''; ch = getchar(); }
return x * f;
} unordered_map<ll, double> mp;
int a[][]; ll getsta() {
ll ret = ;
for (int i = ; i <= ; i++) ret = ret * + 1LL * a[][i];
for (int i = ; i <= ; i++) ret = ret * + 1LL * a[][i];
return ret;
} double dfs(ll sta, int d) {
if (mp.count(sta)) return mp[sta];
if (sta < ) return ;
if (d == ) return ;
int sum = ;
for (int i = ; i < ; i++)
for (int j = ; j <= ; j++)
sum += a[i][j];
double ret = ;
for (int i = ; i < ; i++) {
for (int j = ; j <= ; j++) {
if (!a[i][j]) continue;
a[i][j]--;
a[i][j-]++;
ll s = getsta();
double res = dfs(s, d - );
a[i][j]++;
a[i][j-]--;
mp[s] = res;
ret += a[i][j] * 1.0 / sum * res;
}
}
return ret;
} int main() {
int n = read(), m = read(), d = read();
for (int i = , x; i <= n; i++) x = read(), a[][x]++;
for (int i = , x; i <= m; i++) x = read(), a[][x]++;
double res = dfs(getsta(), d);
printf("%.8f\n", res);
return ;
}

H - House Lawn Gym - 101933H

题意:有m台机器,每台机器有名字,价格p,每分钟能工作多少c,充一次电能工作多久t,充电需要多久r

有l面积的地待作,问平均每周能工作一次的机器中价格最小的那个,相同的按输入顺序输出

队友把10080说成10800能忍?

平均一下直接就把充电需要的时间给平均进来 得到每分钟工作多少的p'

再用$l/p'$和10080比就得出答案了

可能难就难在输入部分吧。

#include <bits/stdc++.h>
using namespace std; struct Node
{
string name;
int p , c, t, r;
double cc;
}b[];
bool vis[]; int main()
{
ios::sync_with_stdio(false);
int m;
int l;
cin >> l >> m;
string a;
getline(cin,a);
for(int i=;i<=m;i++)
{
getline(cin,a);
int sta = ;
b[i].name = "";
b[i].p = b[i].c = b[i].r = b[i].t = ;
for(int j=;j<a.length();j++)
{
if(a[j]==',')
{
sta++;
continue;
}
if(sta == )
{
b[i].name+=a[j];
}
if(sta == )
{
b[i].p*=;
b[i].p+=a[j]-'';
}
if(sta == )
{
b[i].c*=;
b[i].c+=a[j]-'';
}
if(sta == )
{
b[i].t*=;
b[i].t+=a[j]-'';
}
if(sta == )
{
b[i].r*=;
b[i].r+=a[j]-'';
}
}
}
int ans = 1e9;
for (int i = ; i <= m; i++) {
b[i].cc = (b[i].c * b[i].t) * 1.0 / (b[i].t + b[i].r);
if (l / b[i].cc <= ) {
ans = min(ans, b[i].p);
vis[i] = ;
}
}
if (ans == (int)1e9) puts("no such mower");
else {
for (int i = ; i <= m; i++) {
if (vis[i] && ans == b[i].p) {
cout << b[i].name << '\n';
}
}
}
return ;
}

J - Jumbled String Gym - 101933J

题意: 0 1串 给你00出现的次数a 01出现的次数b 10出现的次数c 11出现的次数d

问能否构造出01串

WA了好几发 一度崩溃

首先由a d能推出0和1的个数 必定是一个C(n, 2) 把a和d乘二开根 和加一相乘是否等于2a和2d来判断

第二部分

用两个数组表示

$a_{i}$表示第i个0后面出现了几个1

$b_{i}$表示第i个0前面出现了几个1

必定有$a_{i} + b_{i} = cnt_{1}$        $a_{i}\geq a_{i+1}$        $b_{i}\leq b_{i+1}$

$\sum ^{cnt_{0}}_{i=1}a_{i} = b$            $\sum ^{cnt_{0}}_{i=1}b_{i} = c$

所以$b + c = cnt_{0}\times cnt_{1}$才有解

随便举几个例子发现贪心的构造均能满足答案

如样例 3 4 2 1

得到$cnt_{0} = 3$   $cnt_{1} = 2$

$a_{i}$ : 2 2 0

$b_{i}$ : 0 0 2

得到 00110 也符合

所以直接构造就完了

不过要注意

0 0 0 0直接输出0或1就可以了

a为0或d为0的情况 如果$b + c = 0$ 那么对应的0的个数或1的个数为0 否则才为1

然后瞎jb输出就完了

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar();}
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} int main() {
int a = read(), b = read(), c = read(), d = read();
int sqra = sqrt( * a), sqrd = sqrt( * d);
bool ans = true;
if ((a + b + c + d) == ) {
puts("");
return ;
}
if (sqra * (sqra + ) != a * || sqrd * (sqrd + ) != d * ) {
ans = false;
} else {
int cnt0 = sqra, cnt1 = sqrd;
cnt0++, cnt1++;
if (cnt1 == && (b + c) == ) cnt1 = ;
if (cnt0 == && (b + c) == ) cnt0 = ;
//printf("%d %d\n", cnt0, cnt1);
if (b + c != cnt0 * cnt1) {
ans = false;
} else {
if (cnt1 == ) {
while (cnt0--) putchar('');
return ;
}
if (cnt0 == ) {
while (cnt1--) putchar('');
return ;
}
int k = b / cnt1;
for (int i = cnt0; i > cnt0 - k; i--) putchar('');
cnt0 -= k;
k = b - k * cnt1;
if (k) {
k = cnt1 - k;
for (int i = cnt1; i > cnt1 - k; i--) putchar('');
cnt1 -= k;
putchar(''), cnt0--;
}
while (cnt1--) putchar('');
while (cnt0--) putchar('');
return ;
}
}
if (!ans) puts("impossible");
return ;
}

K - King's Colors Gym - 101933K

题意:一棵树n个节点,k种颜色,问有多少种方案用上k个颜色并且相邻两节点颜色不同

我以为要用树形dp做,赛后看题解才明白是个容斥。

用k种的情况是$k\times \left( k-1\right) ^{n-1}$然后其中包含了只用了k-1种 只用了k-2种...的情况

容斥一下就好了

#include <bits/stdc++.h>
#define ll long long
using namespace std; inline ll read() {
ll x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ''; ch = getchar(); }
return x * f;
} const ll mod = 1e9 + ;
const int N = ;
ll C[N][N];
void init() {
for (int i = ; i < N; i++) C[i][] = , C[i][] = i;
for (int i = ; i < N; i++)
for (int j = ; j <= i; j++)
C[i][j] = (C[i-][j-] + C[i-][j]) % mod;
} ll qm(ll a, ll b) {
ll res = ;
while (b) {
if (b & ) res = res * a % mod;
a = a * a % mod;
b >>= ;
}
return res;
} int main() {
init();
ll n = read(), k = read();
for (int i = ; i < n; i++) read();
ll ans = , flag = ;
for (int i = k; i >= ; i--) {
ll temp = flag * i * qm((ll)i - , n - ) % mod * C[k][i];
ans = (ans + temp + mod) % mod;
flag = -flag;
}
printf("%lld\n", ans);
return ;
}

2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) - 4.28的更多相关文章

  1. (寒假GYM开黑)2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    layout: post title: 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) author: &qu ...

  2. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举

    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)- D. Delivery Delays -二分+最短路+枚举 ...

  3. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp

    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)-E. Explosion Exploit-概率+状压dp [P ...

  4. 2019年湖南多校第一场||2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    第一场多校就打的这么惨,只能说自己太菜了,还需继续努力啊- 题目链接: GYM链接:https://codeforces.com/gym/101933 CSU链接:http://acm.csu.edu ...

  5. Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)

    (本套题算是比较温和吧,就是罚时有点高. B .Baby Bites 题意:给出一个婴儿给出的数组,有一些数字听不清楚,让你还原,问它是否是一个从1开始的一次增加的数组. 思路:从左往右依次固定,看是 ...

  6. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) Solution

    A. Altruistic Amphibians Upsolved. 题意: $有n只青蛙,其属性用三元组表示 <l_i, w_i, h_i> l_i是它能跳的高度,w_i是它的体重,h_ ...

  7. [十一集训] Day1 (2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018))

    A Altruistic Amphibians 原题 题目大意: n只青蛙在高度为d的井中,每只有跳跃距离.重量和高度,每只青蛙可以借助跳到别的青蛙的背上而跳出井,每只青蛙能承受的最大重量是自身重量, ...

  8. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) D. Delivery Delays (二分+最短路+DP)

    题目链接:https://codeforc.es/gym/101933/problem/D 题意:地图上有 n 个位置和 m 条边,每条边连接 u.v 且有一个距离 w,一共有 k 个询问,每个询问表 ...

  9. 2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians (DP)

    题目链接:https://codeforc.es/gym/101933/problem/A 题意:有 n 只青蛙在一个坑里面,要求可以跳出坑的青蛙的最大数量.每个青蛙有 3 种属性:l 为青蛙一次可以 ...

随机推荐

  1. 【一套代码小程序&Native&Web阶段总结篇】可以这样阅读Vue源码

    前言 前面我们对微信小程序进行了研究:[微信小程序项目实践总结]30分钟从陌生到熟悉 在实际代码过程中我们发现,我们可能又要做H5站又要做小程序同时还要做个APP,这里会造成很大的资源浪费,如果设定一 ...

  2. Selenium的发展历史及原理

    目录 1. selenium1.0的产生 2. webdriver的产生 3. selenium和webdriver的合并 4. selenium3.0的产生 1. selenium1.0的产生 为什 ...

  3. GoLang structTag说明

    在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct { UserId int `json:"use ...

  4. C# 连接/查询Jira

    查询jira数据,如果是前端,可以按照如下格式直接访问,获取数据 http://jira.company.com/rest/api/2/search?jql=project = REM AND res ...

  5. linux下载服务器上的文件命令-sz

    语法:sz  文件 比如要下载下面这个com.zip这个压缩包 输入sz com.zip 弹出下载页面,即可开始下载文件

  6. 1.常用turtle功能函数

    #turtle常用命令汇总,括号中的参数仅仅作为举例使用,可根据需要修改 #设置画面背景色 turtle.bgcolor("black") #设置窗口大小和在屏幕上的坐标 turt ...

  7. element表格添加查看操作

    表格代码:黄色部分关键代码 首先看效果: <el-table :data="tableData" border height="480" style=&q ...

  8. 处理范例代码Webapi中的Mongodb的Bson中ObjectId反序列化异常

    微软代码范例中的一个Bug 处理Mongodb的Bson中ObjectId反序列化异常 https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/f ...

  9. 好代码是管出来的——C#的代码规范

    代码是软件开发过程的产物,代码的作用是通过编译器编译后运行,达到预期的效果(功能.稳定性.安全性等等),而另外一个重要作用是给人阅读.对于机器来说只要代码正确就能够正确的运行程序,但是人不同,如果代码 ...

  10. SQL Server系统视图sys.master_files不能正确显示数据库脱机状态

    最近发现在SQL Server数据库(目前测试过SQL Server 2008, 2012,2014,2016各个版本)中,即使数据库处于脱机(OFFLINE)状态,但是sys.master_file ...