数组栈、队列和stl笔记(过几天就写完了)

牛客竞赛语法入门班数组栈、队列和stl习题

A-老子的全排列呢

解法1:神仙 ------> next_permutation();(还有prev_permutation();)

用法:如果存在下一个字典序则返回true,否则返回false

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

//输出1-8的全排列
int main(){
    int a[]={1,2,3,4,5,6,7,8};
    do{
        for(int i=0;i<7;i++)
            printf("%d ",a[i]);
        printf("%d\n",a[7]);
    }while(next_permutation(a,a+8));
    return 0;
}

next_permutation():

1.对1,1,2的排序{1,1,2} {1,2,1} {2,1,1}(排除了重复的)

2.可以选则区间排字母序

解法2 :dfs实现全排列

 B-装进肚子

先全部糖都早上吃,然后记录每个糖换成晚上吃能多多少甜蜜值,sort排序(默认升序)后加上最大的n-k个delt(表示差值)

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

inline int read(){
    char ch=getchar();int s=0,w=1;
    while(ch<48||ch>57){
        if(ch=='-')w=-1;ch=getchar();
    }
    while(ch>=48&&ch<=57){
        s=(s<<1)+(s<<3)+ch-48;ch=getchar();
    }
    return s*w;
}
inline void write(ll x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
int delt[100010],morning[100010],evening[100010];//delt=evening-morning

int main(){
    int n,k;
    n=read(),k=read();
    //假设全部都早上吃
    ll sum=0;
    for(int i=0;i<n;i++){
        morning[i]=read();
        sum+=morning[i];
    }
    for(int i=0;i<n;i++)
        evening[i]=read();
    for(int i=0;i<n;i++)
        delt[i]=evening[i]-morning[i];
    
    sort(delt,delt+n);
    for(int i=n-1;i>=k;i--){
        sum+=delt[i];
    }
    write(sum);
    return 0;
}

C-牛牛的三角形

跟上题差不多,对边长进行排序,后面进行判断就行

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

inline int read(){
    char ch=getchar();int s=0,w=1;
    while(ch<48||ch>57){
        if(ch=='-')w=-1;ch=getchar();
    }
    while(ch>=48&&ch<=57){
        s=(s<<1)+(s<<3)+ch-48;ch=getchar();
    }
    return s*w;
}

inline void write(ll x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}

int eage[110];

int main(){
    int n;
    n=read();

    for(int i=0;i<n;i++)
        eage[i]=read();
    sort(eage,eage+n);
    
    bool treck=false;
    for(int i=2;i<n;i++){
        if(eage[i]<eage[i-1]+eage[i-2]){
            treck=true;
            printf("%d %d %d",eage[i-2],eage[i-1],eage[i]);
            break;
        }
    }
    if(!treck)printf("No solution");

    return 0;
}

D-[NOIP1998]拼数

偷瞄了一眼题解,真的好聪明啊啊啊啊,比较两个字符串,如果a+b>b+a,那么就把a放在前面

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

inline int read(){
    char ch=getchar();int s=0,w=1;
    while(ch<48||ch>57){
        if(ch=='-')w=-1;ch=getchar();
    }
    while(ch>=48&&ch<=57){
        s=(s<<1)+(s<<3)+ch-48;ch=getchar();
    }
    return s*w;
}

bool cmp(string a,string b){
    return a+b>b+a;
}


int main(){
    int n;
    n=read();
    string s[n];
    for(int i=0;i<n;i++)
        cin>>s[i];

    sort(s,s+n,cmp);

    for(int i=0;i<n;i++)
        cout<<s[i];

    return 0;
}

 E-好串

这里找到规律真的超级简单:1.字符串中a和b的数量相同

2.前i个元素中(i是小于n的任意正整数),a的个数总大于b的个数(注意到插入的顺序a就是在b的前面所以当然任意前i个元素中,a的数量比b多)

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

int main(){
    string s;
    cin>>s;

    int cnt_a=0,cnt_b=0,i;
    for(i=0;i<s.size();i++){
        if(s[i]=='a')++cnt_a;
        else ++cnt_b;
        if(cnt_b>cnt_a)break;
    }
    if(i==s.size() && cnt_a==cnt_b)cout<<"Good";
    else cout<<"Bad";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值