牛客练习赛10

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述 

有n个地方,编号为1->n,任意两个地方有公交车,从i到j的票价为(i+j)mod(n+1),而且这个票可以用无限次,你要把这些地方全部走一遍,问最小花费为多少。可以在任意地方开始和结束。

输入描述:

第一行一个数n

输出描述:

输出一行一个数表示答案
示例1

输入

10

输出

4

说明

1 -> 10 -> 2 -> 9 -> 3 -> 8 -> 4 -> 7 -> 5 -> 6,代价是4

备注:

对于100%的数据,有1 <= n <= 100000
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        cout<<(n-1)/2<<endl;
    }
    return 0;
}
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述 

给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列

输入描述:

第一行一个数n
第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格

输出描述:

输出一行n个数表示答案,用空格隔开,结尾无空格
示例1

输入

5
2 1 5 3 4

输出

5 4 3 1 2

说明

2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈

备注:

对于100%的数据,有1<=n<=1000000,保证给的是一个排列

#include<bits/stdc++.h>
int a[1000003],b[1000002];
using namespace std;
stack<int> P;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        sort(b,b+n);int r=n-1;
        for(int i=0;i<n;i++)
        {
            P.push(a[i]);
            while(P.top()==b[r])
            {
                if(r==0) printf("%d\n",b[r]);
                else printf("%d ",b[r--]);
                P.pop();
            }
        }
        while(!P.empty())
        {
            if(P.size()==1) printf("%d\n",P.top());
            else printf("%d ",P.top());
            P.pop();
        }
    }
    return 0;
}
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述 

给定长度为n的只有小写字母的字符串s,进行m次操作,每次将[l,r]范围内所有c1字符改成c2,输出操作完的字符串

输入描述:

第一行两个数n,m
第二行一个字符串s
之后m行,每行两个数l r两个字符c1 c2

输出描述:

输出一行一个字符串
示例1

输入

5 3
wxhak
3 3 h x
1 5 x a
1 3 w g

输出

gaaak

说明

第一次修改后为wxxak
第二次修改后为waaak
第三次修改后为gaaak

备注:

对于100%的数据,有1<=n , m<=100

#include<bits/stdc++.h>
int a[1000003],b[1000002];
using namespace std;
stack<int> P;
int main()
{
    int n,m;char t[102];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        scanf("%s",&t);
        while(m--)
        {
            int a,b;char x,y;
            cin>>a>>b>>x>>y;
            a--,b--;
            for(int i=a;i<=b;i++)
                if(t[i]==x) t[i]=y;
        }
        printf("%s\n",t);
    }
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值