codeforces educational round 73 div2 ABCD

A. 2048 Game

Description

给出n个2的幂次数,问能否累加得到2048

Solution

从小往上累加。

B. Knights

Description

Solution

贪心构造。

奇数位和偶数位放置不同就行了。

C. Perfect Team

Description

给出三个数,$c,m,x$代表每种选手的个数。

每三个人组一队,每队要求至少有一个c,一个m。

问最多能组多少支队伍。

Solution

显然最多只能组成$min(c,m)$只队伍。

这是在$x \geq min(c,m)$的情况下能取到这个值。

在$x \lt min(c,m)$时,还有限制条件是$res \leq \frac{c+m+x}{3}$

相当于有$x$队是$1:1:1$,然后剩下的c和m随机12/21配对

  1 #include <algorithm>
  2 #include <numeric>
  3 #include <cctype>
  4 #include <cmath>
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <iostream>
  9 #include <map>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(‘ ‘)
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e5 + 10;
 31 template <class T>
 32 inline T read()
 33 {
 34     int f = 1;
 35     T ret = 0;
 36     char ch = getchar();
 37     while (!isdigit(ch))
 38     {
 39         if (ch == ‘-‘)
 40             f = -1;
 41         ch = getchar();
 42     }
 43     while (isdigit(ch))
 44     {
 45         ret = (ret << 1) + (ret << 3) + ch - ‘0‘;
 46         ch = getchar();
 47     }
 48     ret *= f;
 49     return ret;
 50 }
 51 template <class T>
 52 inline void write(T n)
 53 {
 54     if (n < 0)
 55     {
 56         putchar(‘-‘);
 57         n = -n;
 58     }
 59     if (n >= 10)
 60     {
 61         write(n / 10);
 62     }
 63     putchar(n % 10 + ‘0‘);
 64 }
 65 template <class T>
 66 inline void writeln(const T &n)
 67 {
 68     write(n);
 69     puts("");
 70 }
 71 template <typename T>
 72 void _write(const T &t)
 73 {
 74     write(t);
 75 }
 76 template <typename T, typename... Args>
 77 void _write(const T &t, Args... args)
 78 {
 79 write(t), pblank;
 80  _write(args...);
 81 }
 82 template <typename T, typename... Args>
 83 inline void write_line(const T &t, const Args &... data)
 84 {
 85    _write(t, data...);
 86 }
 87 int main(int argc, char const *argv[])
 88 {
 89 #ifndef ONLINE_JUDGE
 90     freopen("in.txt","r", stdin);
 91     // freopen("out.txt","w", stdout);
 92 #endif
 93     int t = read<int>();
 94     while(t--){
 95         ll c = read<ll>(), m = read<ll>(), x = read<ll>();
 96         ll res = min(c, m);
 97         res = min(res, (c + m + x) / 3);
 98         writeln(res);
 99     }
100     return 0;
101 }

D. Make The Fence Great Again

Description

给出两个序列对应篱笆的高度和对应篱笆高度增加的代价。

要求序列内相邻篱笆的高度不同的最小代价。

Solution

一开始想二分,想到最后也没想出个所以。

容易得到序列内的值最多不会增加超过两次。

$2,2,3$如果第二个2的代价最小,那它也只增加两次,其他情况都是小于两次的。

这样想就容易想到经典dp走楼梯,当前楼梯可以由之前楼梯走一步或两步得到,当然由于题目特殊这里0步也阔以。

而且需要为每一步加上一个走的代价。最后求一个最小值。

$dp[i][j]$代表当前第i个值需要加j次满足题意的最小代价。

那么$dp[i][j]$可以由$dp[i-1][k]$转移得到,当且仅当$a[i]+j!=a[i-1]+k$

  1 #include <algorithm>
  2 #include <numeric>
  3 #include <cctype>
  4 #include <cmath>
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <cstring>
  8 #include <iostream>
  9 #include <map>
 10 #include <queue>
 11 #include <set>
 12 #include <stack>
 13 #if __cplusplus >= 201103L
 14 #include <unordered_map>
 15 #include <unordered_set>
 16 #endif
 17 #include <vector>
 18 #define lson rt << 1, l, mid
 19 #define rson rt << 1 | 1, mid + 1, r
 20 #define LONG_LONG_MAX 9223372036854775807LL
 21 #define pblank putchar(‘ ‘)
 22 #define ll LL
 23 #define fastIO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 3e5 + 10;
 31 template <class T>
 32 inline T read()
 33 {
 34     int f = 1;
 35     T ret = 0;
 36     char ch = getchar();
 37     while (!isdigit(ch))
 38     {
 39         if (ch == ‘-‘)
 40             f = -1;
 41         ch = getchar();
 42     }
 43     while (isdigit(ch))
 44     {
 45         ret = (ret << 1) + (ret << 3) + ch - ‘0‘;
 46         ch = getchar();
 47     }
 48     ret *= f;
 49     return ret;
 50 }
 51 template <class T>
 52 inline void write(T n)
 53 {
 54     if (n < 0)
 55     {
 56         putchar(‘-‘);
 57         n = -n;
 58     }
 59     if (n >= 10)
 60     {
 61         write(n / 10);
 62     }
 63     putchar(n % 10 + ‘0‘);
 64 }
 65 template <class T>
 66 inline void writeln(const T &n)
 67 {
 68     write(n);
 69     puts("");
 70 }
 71 template <typename T>
 72 void _write(const T &t)
 73 {
 74     write(t);
 75 }
 76 template <typename T, typename... Args>
 77 void _write(const T &t, Args... args)
 78 {
 79 write(t), pblank;
 80  _write(args...);
 81 }
 82 template <typename T, typename... Args>
 83 inline void write_line(const T &t, const Args &... data)
 84 {
 85    _write(t, data...);
 86 }
 87 ll a[maxn], b[maxn];
 88 ll dp[maxn][3];
 89 int main(int argc, char const *argv[])
 90 {
 91 #ifndef ONLINE_JUDGE
 92     freopen("in.txt","r", stdin);
 93     // freopen("out.txt","w", stdout);
 94 #endif
 95     int t = read<int>();
 96     while(t--){
 97         n = read<int>();
 98         for (int i = 1; i <= n;i++)
 99             a[i] = read<ll>(), b[i] = read<ll>(), dp[i][0] = dp[i][1] = dp[i][2] = 1e18+10;
100         for (int i = 1; i <= n;i++)
101             for (int j = 0; j <= 2;j++)
102                 for (int k = 0; k <= 2;k++)
103                     if (a[i]+j!=a[i-1]+k)
104                         dp[i][j] = min(dp[i][j], dp[i - 1][k] + j * b[i]);
105         writeln(min(min(dp[n][0], dp[n][1]), dp[n][2]));
106     }
107     return 0;
108 }

原文地址:https://www.cnblogs.com/mooleetzi/p/11788213.html

时间: 2024-10-10 16:40:56

codeforces educational round 73 div2 ABCD的相关文章

Codeforces Beta Round #73 (Div. 2 Only)

Codeforces Beta Round #73 (Div. 2 Only) http://codeforces.com/contest/88 A 模拟 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define lson l,mid,rt<<1 4 #define rson mid+1,r,rt<<1|1 5 #define sqr(x) ((x)*(x)) 6 #define pb push_back 7

Educational Codeforces Round 74 #div2 ABCD

A. Prime Subtraction Description 给两个数$x,y,x \gt y$,判断$x-y$是否为一个素数的整数倍 Solution 由唯一分解可得每个大于1的数都可以唯一分解为素数幂次之积,显然只需要判断x-y是否大于1即可 1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib&

【codeforces】Round #269 ABCD

A:判断熊象,六个参数,有4个是腿,必须一样,另外两个如果相同是象,不同是熊,不符合要求是喵星人! B:给出几个数,将他们以不下降的方式排一下,若有三种及其以上排法,输出YES,然后任意输出三种排法(序号),有SPJ. C:有n张牌,搭建房子,问有多少种可以搭出来的层数. 来张图吧!表示怎么搭,看不懂?GO HITTING ME!(来打我吖?) 我来一个20以内的表:01001,01101,10111,11111,没有能摆出2的,不要问我为什么. D:给一个大墙(高度略参差不齐),然后再给一面小

Codeforces Educational Round 23

A emmmmmmmmm B emmmmmmmmm C(套路) 题意: 给定n和s(n,s<=1e18),计算n以内有多少个数x满足(x-x的各个位置数字之和)>=s 分析: 容易想到如果x相对于s很大很大,那么肯定是满足条件的 那些小于s的数,肯定是不行的 于是x就可以从s开始,往后枚举1e6个,去判定这1e6个有多少个是满足条件的,再往后的那些x肯定是满足的,直接算出多少个就行了 D(插板法) 题意: 给定一个长度为n(n<=1e6)的数列,对于这个数列的一个连续的子列,定义valu

Codeforces Educational round 58

Ediv2 58 随手AK.jpg D 裸的虚树,在这里就不写了 E 傻逼贪心?这个题过的比$B$都多.jpg #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <cstdlib> #include <queue> #include <iostream> #include <bitset> us

Codeforces Global Round 7【ABCD】(题解)

目录 涵盖知识点:思维.构造.马拉车. 比赛链接:传送门 D题只有数据范围的区别,故只写D2. 好多题啊,随缘更新.(其实懒得写) A - Bad Ugly Numbers B - Maximums C - Permutation Partitions D2 - Prefix-Suffix Palindrome (Hard version) 涵盖知识点:思维.构造.马拉车. 比赛链接:传送门 D题只有数据范围的区别,故只写D2. 好多题啊,随缘更新.(其实懒得写) A - Bad Ugly Nu

Educational Codeforces Round 73 (Rated for Div. 2)

比赛链接:Educational Codeforces Round 73 (Rated for Div. 2) 官方题解:Educational Codeforces Round 73 Editorial A. 2048 Game 题意 如果一个只包含 \(2\) 的幂次的集合,问能否从中选择一些数使得和为 \(2048\). 思路 不断合并直到凑到 \(2048\). 代码 #include <bits/stdc++.h> using namespace std; int main() {

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+