upc 2020年夏混合个人训练第四十九场

问题 D:替换型密码
题目描述

简单的替换型密码是很弱的,它通过将每个字母替换成另外一个字母来加密一个字母组成的信息。考虑下面的替换型密码描述:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
NOPQRSTUVWXYZABCDEFGHIJKLM
这样的描述表示当输入中出现“A”的时候,输出中应该出现的是“N”。同理,每个“B”都变成“O”,以此类推,一直到“Z”都变成“M”。这个特殊的替换型密码的例子被称为“rot13”(旋转13——rotate-13的简称),有一个有趣的特性:它是自解密的。将信息再加密一次就会得到原始的信息。
这样的密码中,单词“CAT”就会成为“PNG”。而句子:
NOWISTHETIMEFORALLGOODPEOPLETOPROGRAMWELL.
就成了:
ABJVFGURGVZRSBENYYTBBQCRBCYRGBCEBTENZJRYY.
注意所有的空格、标点符号以至于任何不在字符集“A”-“Z”中的字符都不变。
请你写一个程序来实现替换型密码。

输入

第一行:没有空格隔开的乱序的二十六个字母“A”-“Z”,这些字母被用于描述替换型密码。
第二行:一段长度在1至80之间的内容,这段内容将被加密。不会有小写字母出现。标点符号,空格和数字都可能出现。没有奇怪的字符(像退格,响铃字符之类)出现。

输出

第一行:输入内容加密后的一行文本。

样例输入
NOPQRSTUVWXYZABCDEFGHIJKLM 
NOW IS THE TIME FOR ALL GOOD PEOPLE TO PROGRAM WELL.
样例输出
ABJ VF GUR GVZR SBE NYY TBBQ CRBCYR GB CEBTENZ JRYY. 
思路

将英文字母对应的加密方式存起来,输出时,是字母就加密输出,不是字母就原样输出

代码:
#include<iostream>
#include<string>
#include<map>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define P pair<int,int>
using namespace std;
typedef long long ll;
const double eps=0.01;
const int N=1010;
//const int maxn=1e5+10;
const int mod=1000000007;
string s,ss;
int a[200];
int main()
{
    getline(cin,s);
    for(int i=0;i<s.size();i++)
    {
        a['A'+i]=s[i];
    }
    getline(cin,ss);
    int len=ss.size();
    for(int i=0;i<len;i++)
    {
        if(ss[i]>='A'&&ss[i]<='Z')
        cout<<(char)a[ss[i]];
        else cout<<ss[i];
    }
    return 0;
}
问题 E:晚餐排队
题目描述

为了避免餐厅过分拥挤,FJ要求奶牛们分2批就餐。每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想,所有第2批就餐的奶牛排在队尾,队伍的前半部分则由设定为第1批就餐的奶牛占据。
由于奶牛们不理解FJ的安排,晚饭前的排队成了一个大麻烦。第i头奶牛有一张标明她用餐批次D_i(1<=D_i<=2)的卡片。虽然所有N(1<=N<=30000)头奶牛排成了很整齐的队伍,但谁都看得出来,卡片上的号码是完全杂乱无章的。
在若干次混乱的重新排队后,FJ找到了一种简单些的方法:奶牛们不动,他沿着队伍从头到尾走一遍,把那些他认为排错队的奶牛卡片上的编号改掉,最终得到一个他想要的每个组中的奶牛都站在一起的队列,例如112222或111122。
有的时候,FJ会把整个队列弄得只有1组奶牛(比方说,1111或222)。
你也晓得,FJ是个很懒的人。他想知道,如果他想达到目的,那么他最少得改多少头奶牛卡片上的编号。所有奶牛在FJ改卡片编号的时候,都不会挪位置。

输入

第1行1个整数N;
第2…N+1行:第i+1行是1个整数,为第i头奶牛的用餐批次D_i。

输出

输出1行1个整数,为FJ最少要改几头奶牛卡片上的编号,才能让编号变成他设想中的样子。

样例输入

7
2
1
1
1
2
2
1

样例输出

2

提示

对于60%的数据满足:N<=50;
对于70%的数据满足:N<=250;
对于80%的数据满足:N<=5000;
对于90%的数据满足:N<=16000;
对于100%的数据满足:N<=30000。

思路

题目就是让我们把 1 单独放在一起,2单独放在一起,找这一操作的最小次数。
我们可以找第 i 头奶牛前 2 的数量,和后 1 的数量(即以第 i 头奶牛为分割点的最小操作次数)(可以来两次前缀和),最后遍历所有奶牛,求(前2+后1)的最小值,即为最小操作次数。

代码:
#include<iostream>
#include<string>
#include<map>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define P pair<int,int>
using namespace std;
typedef long long ll;
const double eps=0.01;
const int N=3e4+10;
//const int maxn=1e5+10;
const int mod=1000000007;
int n,f[N],l[N],a[N],minn=INF;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i-1]==2) f[i]++;
        f[i]+=f[i-1];
    }
    for(int i=n;i>=1;i--)
    {
        if(a[i+1]==1) l[i]++;
        l[i]+=l[i+1];
    }
    for(int i=1;i<=n;i++)
    {
        if(l[i]+f[i]<minn) minn=l[i]+f[i];
    }
    cout<<minn;
}
问题 F: 越野跑步
题目描述

为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练。贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:
奶牛独自进山的时间不得超过M秒(1<=M<=10000000)。
整条山路被贝茜划分成T个长度相同的小段(1<=T<=100000),并且,贝茜用S_i表示第i个小段的路况。S_i为u,f,d这3个字母之一,它们分别表示第i个小段是上坡、平地,或是下坡。
贝茜要花U秒(1<=U<=100)才能跑完一段上坡路,跑完一段平地的耗时是F秒(1<=F<=100),跑完一段下坡路要花D秒(1<=D<=100)。注意,沿山路原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成了上坡路。
贝茜想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多远。

输入

第1行5个用1个空格隔开的整数:M,T,U,F,以及D;
第2…T+1行:第i+1行为1个字母S_i,描述了第i段山路的路况。

输出

输出1行1个整数,为贝茜在按时回到农场的前提下,最多能跑到多远。

样例输入

13 5 3 2 1
u
f
u
d
f

样例输出

3

提示

对于40%的数据满足:1<=M<=2000;
对于50%的数据满足:1<=M<=35000;
对于60%的数据满足:1<=M<=130000;
对于70%的数据满足:1<=M<=520000;
对于80%的数据满足:1<=M<=1100000;
对于100%的数据满足:1<=M<=10000000,且1<=T<=100000,1<=U,D,F<=100。

思路

计算的时候计算一次(去和回一起算着)
去的上坡就是回的下坡,计算的时候,对于上坡(直接上坡(去)时间+下坡(回)时间),对于下坡(直接下坡(去)时间+上坡(回)时间),对于平地 * 2。最后答案要 -1,因为跳出条件是超出规定时间,但是答案要求是规定时间内,所以 -1.

代码:
#include<iostream>
#include<string>
#include<map>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define P pair<int,int>
using namespace std;
typedef long long ll;
const double eps=0.01;
const int N=1e5+10;
//const int maxn=1e5+10;
const int mod=1000000007;
int m,t,u,f,d,ans,cnt;
char a[N];
int main()
{
    cin>>m>>t>>u>>f>>d;
    for(int i=1;i<=t;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=t;i++)
    {
        if(a[i]=='u'||a[i]=='d') ans+=u+d;
        else ans+=f*2;
        if(ans>m)
        {
            cnt=i;
            break;
        } 
    }
    cout<<cnt-1;
}
问题 G: 奶牛乘法
题目描述

做厌了乘法计算题的贝茜,自创了一种新的乘法运算法则。在这套法则里,AB等于一个取自A、一个取自B的所有数字对的乘积的和。比方说,12345等于14+15+24+25+34+35=54。对于2个给定的数A、B,你的任务是,用新的乘法法则计算A*B的值。

输入

输入1行2个整数A、B,用一个空格隔开。

输出

输出1行1个整数,即新的乘法法则下A*B的值。

样例输入

123 45

样例输出

54

提示

对于30%的数据满足:A,B≤5000;
对于100%的数据满足:1≤A,B≤1000000000。

思路

模拟整个计算过程

代码:
#include<iostream>
#include<string>
#include<map>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define P pair<int,int>
using namespace std;
typedef long long ll;
const double eps=0.01;
const int N=1010;
//const int maxn=1e5+10;
const int mod=1000000007;
ll a,b,ans;
int main()
{
    cin>>a>>b;
    while(a!=0)
    {
        ll temp=b;
        while(temp!=0)
        {
            ans=ans+(a%10)*(temp%10);
            temp=temp/10;
        }
        a=a/10;
    }
    cout<<ans;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值