2019年第五届计蒜之道复赛总结

又是一年计蒜客,沙雕ACMer欢乐多

热心市民yzm10按捺不住冲动,在期末期间又打了一场比赛。

赛点:204(与罚时惊人的相似)

做完两题排在一百多名,以为稳了(其实后面做不动了)比到一半就开始挂机。。

吃完饭回来一看,这名次掉得有点狠啊。。好在是有惊无险地守在前400了

 

 

不管怎么说,总算是弥补了去年的遗憾,T恤到手~

 

上题

 

“星云系统”(单调栈)

  •  18.85%
  •  1000ms
  •  131072K
 

VIPKID 是在线少儿英语教育平台,网络稳定是在线教育课程质量的红线,VIPKID 为此推出了全球最稳定的教育网络系统 —— “星云系统”。星云系统目前建立了覆盖全球 3535 个国家的 55 条核心跨海专线,在 1616 个国家的 5555 个城市建立了中心传输节点,具备一分钟内自由切换路由的能力,确保了全球跨洋课堂的高清音、视频通信,为流畅的课堂体验打下坚实基础。

全世界的中心传输节点和各地的网络节点组成的这个“星云系统”,何其复杂。我们现在只考虑一条支线上的网络节点,每一个网络节点比作一个字符的话,这条支线就是一个字符串。

现在给定你一个字符串 ss 以及一个整数 kk,请求出 ss 的字典序最小的长度为 kk 的子序列。

输入格式

第一行一个由小写英文字母构成的字符串 ss,第二行一个正整数 kk。

输出格式

一行一个字符串 ans,表示答案。

数据规模

0 < k \leq |s| \leq50000000<ks5000000

样例输入

helloworld
5

样例输出

ellld



用单调栈模拟就好,题目数据范围STL会爆。
依次将字母放入栈中,若当前栈顶字母较大则取出,还要保证栈中元素与剩余元素之和不小于k。最后取前k个输出。


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

string s;
char st[5000005];

int main()
{
    int n,m,c,i,j;
    cin>>s;
    scanf("%d",&n);
    int len=s.length();
    c=0;
    for(i=0;i<len;i++){
        while(c>0&&s[i]<st[c]&&c+len-i>n){
            c--;
        }
        c++;
        st[c]=s[i];
    }
    for(i=1;i<=n;i++){
        printf("%c",st[i]);
    }
    printf("\n");
    return 0;
}
“星云系统”

 

 

个性化评测系统(麻将搜索)

  •  24.67%
  •  1000ms
  •  262144K
 

“因材施教”的教育方式自古有之,互联网时代,要实现真正意义上的个性化教育,离不开大数据技术的扶持。VIPKID 英语 2020 多万学员每月在课前预习、课中教学、课后复习、作业、答题测评等环节会产生超过 100100 TB 的数据增量,在对庞大数据进行分析之后,个性化评测系统会自动生成针对每个学生的量化学习报告和个性化学习图谱。

正在拿着自己的个性化学习图谱总结分析的 Dino,看到走来的小明手中拿的麻将牌,心生一题,给小明出了一道难题:“你知道怎么输出听牌吗?”看到复杂的规则,小明皱起了眉毛,请你一起来帮小明解决吧!请看题:

在麻将游戏中,有 3434 种牌,分别是 1-919 的万,1-919 的筒,1-919 的条,以及 77 种字牌 “东”,“南”,“西”,“北”,“白”,“发”,“中”。

这 3434 种牌各四张,共 136136 张。

如果你手牌中凑够了 1414 张牌,满足一定的牌型条件,就称作“和牌”。

这个牌型有很多种,但在本题中,只考虑最基本的一种,44 个面子 + 11 个雀头组成的牌型。

面子是刻子和顺子的统称,雀头是对子。

刻子指的是,三张一样的牌。

顺子指的是,三张连续的牌,注意,只有非字牌(也就是万,筒,条)才能连续,例如一二三万,四五六筒,并且不能循环连续,比如九一二条就不算顺子。

对子指的是,两张一样的牌。

现在,zcy 手中有 1313 张牌,并且再得到某一张牌,就可以和牌,而你的目标就是输出能使 zcy 和牌的牌。

注意一种特殊情况,如果你手牌中某张牌有四张,而再得到这张牌也能和牌,这张牌在本题中不需要输出,因为这张牌总共就只有四张,不可能拿到手了。

(如果你知道什么是杠,请假装不能杠,如果你不知道,那就不需要知道了。)

输入格式

1-919 万用对应数字 + 一个小写 mm 表示

1-919 条用对应数字 + 一个小写 ss 表示

1-919 筒用对应数字 + 一个小写 pp 表示

​东南西北白发中分别用 1-717 的数字 + 一个小写 zz 表示

​输入多组数据,每组共 1313 个数字 + 字母的组合,用空格隔开

​输入保证有解

输出格式

对于每组数据,输出若干行,每行一个听牌,按照万,条,筒,字的顺序输出听牌,同类型按照数从小到大输出

数据组数不超过 1010 组

样例输入

1s 2s 3s 4s 5s 6s 7s 8s 9s 1z 1z 3p 4p

样例输出

2p
5p




麻将题,HDU 4431 Mahjong简化版。
给你十三张牌,问听哪几张。
之前集训的时候做过类似的题,也亏是会点麻将减少了读题时间(雀神不是白叫的),搜索就好见代码。


#include <bits/stdc++.h>
#define MAX 100
#define LL 29
#define RR 37
using namespace std;
typedef long long ll;

int c[MAX],b[MAX];
int f;
map<string,int>mp;
struct Node{
    int x;
    char s;
}a[MAX];
bool cmp(Node a,Node b){
    if(a.s==b.s) return a.x<b.x;
    if(a.s=='m'&&b.s=='p') return 1;
    if(a.s=='m'&&b.s=='s') return 1;
    if(a.s=='p'&&b.s=='s') return 1;
    return 0;
}
void sub(int i){
    c[i]-=3;
    f-=3;
}
void add(int i){
    c[i]+=3;
    f+=3;
}
int dfs(){
    if(f==0) return 1;
    for(int i=1;i<=LL;i++){
        if(c[i]>=3){
            sub(i);
            if(dfs()==1){
                add(i);
                return 1;
            }
            add(i);
        }
    }
    for(int i=1;i<=LL;i++){
        if(c[i]>0&&c[i+1]>0&&c[i+2]>0){
            for(int j=0;j<3;j++){
                c[i+j]--;
            }
            f-=3;
            if(dfs()==1){
                for(int j=0;j<3;j++){
                    c[i+j]++;
                }
                f+=3;
                return 1;
            }
            for(int j=0;j<3;j++){
                c[i+j]++;
            }
            f+=3;
        }
    }
    return 0;
}
 
int pd(){
    for(int i=1;i<=RR;i++){
        if(c[i]>=2){
            c[i]-=2;
            f=12;
            int ff=1;
            for(int j=31;j<=RR;j++)
            {
                if(c[j]==3){
                    f-=3;
                }
                else if(c[j]>0){
                    ff=0;
                    break;
                }
            }
            if(ff==0) {
                c[i]+=2;
                continue;
            }
            if(dfs()==1){
                c[i]+=2;
                return 1;
            }
            c[i]+=2;
        }
    }
    return 0;
}
 
int main()
{
    int n,m,i,j;
    string s,ss;
    mp["1m"]=1; mp["1s"]=11; mp["1p"]=21;mp["1z"]=31;
    mp["2m"]=2; mp["2s"]=12; mp["2p"]=22;mp["2z"]=32;
    mp["3m"]=3; mp["3s"]=13; mp["3p"]=23;mp["3z"]=33;
    mp["4m"]=4; mp["4s"]=14; mp["4p"]=24;mp["4z"]=34;
    mp["5m"]=5; mp["5s"]=15; mp["5p"]=25;mp["5z"]=35;
    mp["6m"]=6; mp["6s"]=16; mp["6p"]=26;mp["6z"]=36;
    mp["7m"]=7; mp["7s"]=17; mp["7p"]=27;mp["7z"]=37;
    mp["8m"]=8; mp["8s"]=18; mp["8p"]=28;
    mp["9m"]=9; mp["9s"]=19; mp["9p"]=29;
    while(getline(cin,s)){
        memset(c,0,sizeof(c));
        int len=s.length();
        for(i=0;i<len;i++){
            if(i%3==0){
                ss="";
                ss+=s[i];
                ss+=s[i+1];
                c[mp[ss]]++;
            }
        }
        int k=0;
        for(i=1;i<=RR;i++){
            if(i%10==0) continue;
            if(c[i]==4) continue;
            if(c[i-1]==0&&c[i]+1==4&&c[i+1]==0) continue;
            if(c[i-1]==0&&c[i]==0&&c[i+1]==0) continue;
            c[i]++;
            if(pd()==1) b[++k]=i;
            c[i]--;
        }
        int cc=0;
        for(i=1;i<=k;i++){
            if(b[i]<10){
                cc++;
                a[cc].x=b[i]%10;
                a[cc].s='m';
            }
            else if(b[i]<20){
                cc++;
                a[cc].x=b[i]%10;
                a[cc].s='s';
            }
            else if(b[i]<30){
                cc++;
                a[cc].x=b[i]%10;
                a[cc].s='p';
            }
            else{
                cc++;
                a[cc].x=b[i]%10;
                a[cc].s='z';
            }
        }
        sort(a+1,a+cc+1,cmp);
        for(i=1;i<=cc;i++){
            printf("%d%c\n",a[i].x,a[i].s);
        }
    }
    return 0;
}
个性化评测系统

 

posted @ 2019-06-16 19:30  yzm10  阅读(396)  评论(0编辑  收藏  举报