#529. 【美团杯2020】114514【贪心】

2023-10-17 23:30
文章标签 2020 贪心 529 美团杯 114514

本文主要是介绍#529. 【美团杯2020】114514【贪心】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接


  题目给出的条件是给出一个长度不超过6e5的串,它一定是由n个“114514”组成的长度为6n的串。114514的顺序一定是按照这个顺序,但是排列可以是错综复杂的,但是保证一定有解。

  一个“114514”中有两个‘4’,这是很关键的,我们可以把原式拆成11(4a)51(4b)这样的形式,4a指的是出现于前面的4,4b指的是出现于后面的4。于是我们想根据(4a)、(4b)确定这个串的组合。

  如果我们确定了4a、4b,那么首先就可以确定5了,从后往前,第i个4a对应第i个4b对应第i个5,于是接下去只需要确定1的位置就可以了。

  这里,我们不妨将1、4作为相互关系的两个信息来进行用以确定4是4a还是4b这样的一个功能。

这里需要满足如下的条件:

  1. 4a前面需要有两个1
  2. 4b前面(4a后面)需要有一个1

  譬如说,有一个后缀,该后缀有x个1以及有y个4,那么,如果x>y了,就说明现在后面有4a了,因为两个1和一个1的关系,所以后面如果有(x - y)个4a,于是剩下(2y - x)个4b,就会使得2y - x + 2 * (x - y) = 2y - x + 2x - 2y = x此时1的条件是可以满足的。

  于是,我们可以确定每一个后缀中的4a的最少的数量,然后同时也可以确定1的位置了。

  因为从贪心的角度来看,在满足上述条件的情况下,4b的前一个1,越靠后越好,所以根据这则信息,我们找到一个4b,就将其前面的一个1给它,而在其后面的但是却没有用掉的1,作为4a的1来进行使用。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 6e5 + 7;
int one[2][maxN], five[maxN], four[2][maxN], top[5];   //'1' '4a' '5' '1' '4b'
char s[maxN];
int N, len, need_a[maxN] = {0}, suff[maxN][2] = {0};
signed main()
{int T; scanf("%d", &T);while(T--){memset(top, 0, sizeof(top));scanf("%s", s + 1);len = (int)strlen(s + 1);N = len / 6;suff[len + 1][0] = suff[len + 1][1] = 0;for(int i=len; i>=0; i--){suff[i][0] = suff[i + 1][0];    //'1'suff[i][1] = suff[i + 1][1];    //'4'if(s[i] == '1'){suff[i][0]++;}else if(s[i] == '4'){suff[i][1]++;}need_a[i] = max(0, suff[i][0] - suff[i][1]);}for(int i=0; i<=len; i++) need_a[i + 1] = max(need_a[i + 1], need_a[i] - (s[i] == '4'));int pos = len;
//        for(int i=1; i<=len; i++) printf("%d%c", need_a[i], i == len ? '\n' : ' ');for(int i=len, have_a = 0; i>=1; i--){if(s[i] == '4'){if(have_a < need_a[i]){four[0][++top[1]] = i;have_a++;}else{four[1][++top[4]] = i;while(pos >= i){if(s[pos] == '1') one[0][++top[0]] = pos;pos--;}while(s[pos] != '1') pos--;one[1][++top[3]] = pos;pos--;}}else if(s[i] == '5'){five[++top[2]] = i;}}while(pos >= 1){if(s[pos] == '1') one[0][++top[0]] = pos;pos--;}for(int i=N; i>=1; i--) printf("%d %d %d %d %d %d\n", one[0][(i << 1)], one[0][(i << 1) - 1], four[0][i], five[i], one[1][i], four[1][i]);}return 0;
}

 

这篇关于#529. 【美团杯2020】114514【贪心】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/228679

相关文章

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

ural 1820. Ural Steaks 贪心

1820. Ural Steaks Time limit: 0.5 second Memory limit: 64 MB After the personal contest, happy but hungry programmers dropped into the restaurant “Ural Steaks” and ordered  n specialty steaks

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

BUYING FEED(贪心+树状动态规划)

BUYING FEED 时间限制: 3000 ms  |  内存限制: 65535 KB 难度:4 描述 Farmer John needs to travel to town to pick up K (1 <= K <= 100)pounds of feed. Driving D miles with K pounds of feed in his truck costs D

vua 10700-Camel trading 贪心以及栈

大意:给一个表达式,可以让你任意套括号,问套完括号最大最小值是多少 贪心策略:最大的话,先+后*                  最小的话,先*后+ 用了一个栈堆模拟运算的次序 #include<stdio.h>#include<iostream>#include<stack>using namespace std;int main(){int N;scanf("%d",&