ACM day 3.0

OJ.109
OJ.110
OJ.111
OJ.112

栈的问题

栈的基本操作:
(1)初始化栈 stackvis ,定义一个栈
(2)入栈 vis.push(x)
(3)出栈 vis.pop()
(4)判断是否为空 vis.empty()
(5)判断栈中元素的数量vis.size()
(6)得到栈的栈顶元素 vis.top()
综上: #include
用<bits/stdc++.h>则无需考虑头文件
1.
Description:
程序员输入程序出现差错时,可以采取以下的补救措施:按错了一个键时,可以补按一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以按一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。

Input:
输入一行字符,个数不超过 100。

Output:
输出一行字符,表示实际有效字符。

Sample Input:
sdfosif@for (ii#=1,#;i<.#=8;i+++#);

Sample Output:
for (i=1;i<=8;i++);

Hint:
例子输入2:1234##
例子输出2:12

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack<char>s1;
    stack<char>s2;
    char str[105]={0};
    scanf("%[^\n]",str);
    int i;
    int len=strlen(str);
    for(i=0;i<len;i++)
    {
        if(str[i]=='@')
        {
            while(!s1.empty())
                s1.pop();
        }
        else if(str[i]=='#')
        {
            if(!s1.empty())
                s1.pop();
        }
        else
            s1.push(str[i]);
    }
    while(!s1.empty())
    {
        s2.push(s1.top());
        s1.pop();
    }
    while(!s2.empty())
    {
        printf("%c",s2.top());
        s2.pop();
    }
    printf("\n");
    return 0;
}

Description:
小谢虽然有很多溶液,但是还是没有办法配成想要的溶液,因为万一倒错了就没有办法挽回了。因此,小谢到网上下载了一个溶液配置模拟器。模拟器在计算机中构造一种虚拟溶液,然后可以虚拟地向当前虚拟溶液中加入一定浓度、一定体积的这种溶液,模拟器会快速地算出倒入后虚拟溶液的浓度和体积。当然,如果倒错了可以撤销。
模拟器的使用步骤如下:
1)为模拟器设置一个初始体积和浓度 V0、C0%。
2)进行一系列操作,模拟器支持两种操作:
P(v,c)操作:表示向当前的虚拟溶液中加入体积为 v 浓度为 c 的溶液;
Z 操作:撤销上一步的 P 操作。

Input:
第一行两个整数,表示 V0 和 C0,0≤C0≤100;
第二行一个整数 n,表示操作数,n≤10000;
接下来 n 行,每行一条操作,格式为:P_v_c 或 Z。
其中 _ 代表一个空格,当只剩初始溶液的时候,再撤销就没有用了,这时只输出初始的体积和浓度。
任意时刻质量不会超过 2^31 -1。

Output:
n 行,每行两个数 Vi,Ci,其中 Vi 为整数,Ci 为实数(保留 5 位小数)。
其中,第 i 行表示第 i 次操作以后的溶液体积和浓度。

Sample Input:
100 100
2
P 100 0
Z

Sample Output:
200 50.00000
100 100.00000

Hint:
例子输入2:
100 100
2
Z
P 100 0
例子输出2:
100 100.00000
200 50.00000

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack <int>v0;
    stack <double>c0;
    char ch;
    int v,n,v1;
    double c,c1;
    cin >> v >> c ;
    v1=v,c1=c;
    v0.push(v);
    c0.push(c);
    cin >> n ;
    while(n--)
    {
        cin >> ch;
        if(ch=='P')
        {
            cin >> v >> c ;
            v0.push(v);
            c0.push(c);
            c1=(c1*v1+v*c)/(v+v1);
            v1=v+v1;
            printf("%d %.5lf\n",v1,c1);
        }
        else if(ch=='Z')
        {
            if(v0.size()>1)
            {
                c1=(c1*v1-v0.top()*c0.top())/(v1-v0.top());
                v1=v1-v0.top();
                v0.pop();
                c0.pop();
                printf("%d %.5lf\n",v1,c1);
            }
            else
                printf("%d %.5lf\n",v1,c1);
        }
    }
    return 0;
}

3.Description:
如果一列火车有4列车厢,经过编组后,车厢的编组顺序为3,2,4,1;你知道编组站是如何编组的吗?编组的过程是由若干个进栈,出栈操作构成的。

Input:
第1行1个正整数n,n<=100;
第2行n个小于或等于n的正整数,表示有 n节车厢,编号为1,2,3,…n,编组时按照进栈,第2行数据表示列车经过编组后的车厢编号顺序。

Output:
一行一个由大写字母A和B构成的字符串,A表示进栈,B表示出栈。表示编组时进栈出栈的操作序列。

Sample Input:
例一:
4
3 2 4 1
例二;
5
1 2 3 4 5

Sample Output:
例一:
AAABBABB
例二:
ABABABABAB

Code:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack<int>cx;
    int n,i,j;
    cin >> n;
    int a[100];
    for(i=1;i<=n;i++)
        cin >> a[i] ;
    cx.push(1);
    printf("A");
    i=1;
    j=2;
    int x=2*n-1;
    while(x--)
    {
        if(cx.empty())
        {
            cx.push(j);
            printf("A");
            j++;
        }
        else if(cx.top()!=a[i])
        {
            cx.push(j);
            printf("A");
            j++;
        }
        else if(cx.top()==a[i])
        {
            cx.pop();
            printf("B");
            i++;
        }
    }
    printf("\n");
    return 0;
}

4.Description:
Bessie 和 Canmuu 将联手洗掉N (1<= N <= 10,000) 个脏盘子。
Bessie 洗; Canmuu 来擦干它们.
每个盘子有一个指定的编号,范围1…N. 开始,所有盘子按顺序排列在栈中,1号盘子在顶端,N号盘子在底端.
Bessie 会先洗一些盘子,然后放在洗过的盘子栈里(这样原来的顺序颠倒).
然后,或者她洗别的盘子,或者Canmuu 擦干她已经洗好的部分或全部盘子,放在擦干的盘子栈里。
这样直到所有盘子洗完擦干后放置的顺序是什么?

Input:
第一行: 一个整数N,表示盘子的数量
以下若干行: 每一行两个整数 ,第一整数为1表示洗盘子,为2表示擦盘子,第二个整数表示数量

Output:
共N行:擦干后盘子从顶端到底端的顺序

Sample Input:
5
1 3
2 2
1 2
2 3

Sample Output:
1
4
5
2
3

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack<int>panzi_dirty;
    stack<int>panzi_wet;
    stack<int>panzi_dry;
    int i,n,f,panzis;
    cin >> n ;
    for(i=n;i>0;i--)
        panzi_dirty.push(i);
    while(cin >> f >> panzis )
    {
        if(f==1)
        {
            while(panzis--)
            {
                panzi_wet.push(panzi_dirty.top());
                panzi_dirty.pop();
            }
        }
        else if(f==2)
        {
            while(panzis--)
            {
                panzi_dry.push(panzi_wet.top());
                panzi_wet.pop();
            }
        }
        if(panzi_dry.size()==n) break;
    }
    while(!panzi_dry.empty())
    {
        printf("%d\n",panzi_dry.top());
        panzi_dry.pop();
    }
    return 0;
}

6.Description:
假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。
本题的任务是检验一个给定表达式中的括号是否正确匹配。
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。

Input:
一行字符,只含有圆括号和方括号,个数小于 255。

Output:
匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。

Sample Input:
[(])

Sample Output:
Wrong

Code:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack<char>kuohao;
    char str[260]={0};
    cin >> str ;
    int n=strlen(str),i;
    kuohao.push(str[0]);
    for(i=1;i<n;i++)
    {
        if(kuohao.empty())
            kuohao.push(str[i]);
        else if(kuohao.top()=='('&&str[i]==')')
            kuohao.pop();
        else if(kuohao.top()=='['&&str[i]==']')
            kuohao.pop();
        else
            kuohao.push(str[i]);
    }
    if(kuohao.empty())
        printf("OK\n");
    else
        printf("Wrong");
    return 0;
}

7.Description:
给定一个只包含加法和乘法的算术表达式,请编程计算表达式的值。

Input:
输入仅有一行,为需要计算的表达式。表达式中只包含数字、加法运算符“+”和乘法运算符“”,且没有括号,所有参与运算的数字均为 0~2^31 -1 之间的整数。输入数据保证这一行只有0~9、+、 这 12 种字符。

Output:
输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。

Sample Input:
【输入样例 1】
1+13+4
【输入样例 2】
1+12345678901
【输入样例 3】
1+1000000003*1

Sample Output:
【输出样例 1】
8
【输出样例 2】
7891
【输出样例 3】
4

#include <bits/stdc++.h>

using namespace std;

int main()
{
    stack<int>a;
    int t,s=0;
    char ch='+';
    while(ch=='+'||ch=='*')
    {
        cin >> t ;
        t=t%10000;
        if(ch=='+')
            a.push(t);
        else if(ch=='*')
        {
            t=(a.top()*t)%10000;
            a.pop();
            a.push(t);
        }
        ch=getchar();
    }
    while(!a.empty())
    {
        s=(s+a.top())%10000;
        a.pop();
    }
    printf("%d\n",s);
    return 0;
}


OJ 6

通宵教室
Problem:6
Time Limit:1000ms
Memory Limit:65536K
Description
高校扩招,教室一度变得很紧张。学生白天上自习的地方较少,晚上教室又闲置着,怎样才能充分利用教学资源,扩大学生自习时空呢?通宵教室解决学生自习空间有限和教学资源不充分利用的问题。开放通宵教室促进了学生学习观念的转变,以前课堂内外基本上是听老师安排,现在是学生自觉在学习。晚上学习效率高、生理调节能力强的学生已经尝到了甜头。好学、考研、辅修、创作的学生又有了一片新的学习时空。
但是通宵教室对传统的学生管理工作带来了一系列的问题。如果通宵教室的利用率不高的话,将教室的所有灯都打开,还会极大地浪费能源。
现在学校对通宵教室灯光使用做一个新的尝试。假设有N个人使用通宵教室,教室里有N盏灯,每个人和每盏灯都有一个编号。开始所有的灯都没打开,第一个人进教室将所有的灯都打开,第二个人将所有的偶数号的灯都关掉,第三个人对所有3的倍数的灯进行如下操作:如果灯开着,就将它关掉,如果灯关着,就将它打开,……,第i个人对所有i的倍数的灯进行如下操作:如果灯开着,就将它关掉,如果灯关着,就将它打开,重复这样的过程,一直到第N个人完成这样的操作。
现在,教室管理员向你求助,他希望知道,完成这样的过程后,教室里开着的灯还有多少盏?
Input
有多组测试数据。第一行是一个正整数T(1<=T<=10000),表示有多少组测试数据。
以下有T行,每行一个测试数据,包含唯一的一个正整数N(1 <= n < 2^32,)。
Output
对于每个测试数据,输出一行包含唯一的一个整数:表示完成这样的过程后,教室里开着的灯的盏数。
Sample Input
2
1
2
Sample Output
1
1
这个题很巧妙,其实就是找因子个数为奇数的数,因子个数为奇数的数就是平方数

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    int T;
    long long n;
    int m;
    while(cin>>T)
    {
        while(T--)
        {
            cin>>n;
            m=sqrt(n);
            cout<<m<<endl;
        }
    }

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值