上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛

链接:https://ac.nowcoder.com/acm/contest/551#question

一、CSL 爱烫头

题目描述

又到了一年一度的樱花节,CSL 的同学邀请 CSL 一起去赏樱花。于是爱美的 CSL 决定好好打扮一下自己。看了看自己日益减少的头发,CSL 觉得再不烫头就来不及了,于是拿出了所有的奖学金,想要做个头发。由于头发实在太少,一般的理发店无法处理,CSL 不得已要到全城最好的理发店。理发师看了看 CSL,叹了口气,然后给 CSL 写了几个能做的发型。已知这是CSL 头秃前最后一次烫头,所以他一定会选择他承受能力范围内最好的发型。

  • XiZhiTang : 1 比特币
  • YingHuaTang : 2 比特币
  • BigBoLang: 3 比特币

输入描述:

仅一行,有一个整数 n,表示 CSL 拥有的奖学金(比特币)数量        0≤n≤100≤n≤10

输出描述:

在一行输出 CSL 会选择的发型。特别地,如果 CSL 承受不起任何发型,则输出 "None"。

示例1

输入

2

输出

YingHuaTang

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef long long LL;
using namespace std;
#define memset(a,n) memset(a,n,sizeof(a))
#define INF 0x3f3f3f3f
const LL MAX = 1e7+10;


int main()
{
    int n;
    cin>>n;

    if(n==0){
        cout<<"None"<=3){
        cout<<"BigBoLang"<

 

二、CSL的英语考试

题目描述

CSL 为了备战即将到来的六级考试,在外面报了一个英语培训班。经过了一学期的学习后,英语老师决定要对 CSL 的学习成果进行检测。老师准备了一份卷子,考虑到 CSL 的英语水平,卷子上只有 n 道判断题,题目是比较两个英语单词的大小。
两个单词的大小是用其字典序来衡量的。所谓字典序就是空字符<`a'<`b'<`c'…`x'<`y'<`z'空字符<`a'<`b'<`c'…`x'<`y'<`z'。

两个单词在比较大小时,会从首字母开始比起,如果两个字母相等则继续比较下一个,如果不等则按照字典序判断大小。举例来说 world 和 wolf 比较:第一次比较首字母,两个单词的首字母都是 w,故继续比较第二个字母。两个单词的第二个字母都是 o,故继续比较第三个字母。r 在字典序中是大于 l 的,因此 world 是大于 wolf 的。

遗憾的是 CSL 记不住字典序,只能把它打到小抄上。而 CSL 的队友偷偷更换了 CSL 的小抄。聪明的你是否能够回答出CSL按照被偷换的字典序做出的试卷答案?

输入描述:

第一行有一个整数 n ,表示卷子上题目的数量。

第二行有 26 个不同的英文小写字母(a - z),之间以空格分割,表示新的字典序。

接下来的 n 行,每行有两个字符串s1,s2s1,s2,之间以空格分割,表示题目中的两个单词。

 

1≤n≤10001≤n≤1000
1≤|s1|,|s2|≤10001≤|s1|,|s2|≤1000

输出描述:

对于每一道题,在一行输出其答案:如果s1s2s1>s2 输出 ">",否则输出 "="。

示例1

输入

3
a b c d e f g h i j k l m n o p q r s t u v w x y z
world wolf
app apple
panda panda

输出

>
<
=

 

题意:

给定n个字符串,代表26个字母的大小顺序,对两个单词进行大小比较

思路:

将26个字母转化成数字 0 - 26 的形式,依次比较相同位的大小

两个单词长度:

①:相同   ②:不同

对于不同的情况,如果 min(len,len1)位都相同,那么最大的一定是长度长的单词

 

CODE:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef long long LL;
using namespace std;
#define memset(a,n) memset(a,n,sizeof(a))
#define INF 0x3f3f3f3f
const LL MAX = 1e7+10;

mapm;

int main()
{
    int n;
    char c;

    string s,t;
    cin>>n;

    for(int i=0; i<26; i++)
    {
        cin>>c;
        m[c]=i+1;
    }


    while(n--)
    {
        cin>>s>>t;

        int ans=0;

        int flag=0;
        if(s.size()==t.size())
        {
            for(int i=0; im[t[i]])
                {
                    cout<<">"<m[t[i]])
                {
                    cout<<">"<"<m[t[i]])
                {
                    cout<<">"<

 

三、CSL 的神奇序列

题目描述

CSL 有一个神奇的无穷实数序列,他的每一项满足如下关系:

对于任意的正整数 n ,有 n∑k=0akan−k=w2∑k=0nakan−k=w2 , 并且 a0=wa0=w 。

CSL 很清楚这样的序列是唯一的,他现在想考考你,你能快速告诉他这个序列的第 n 项是多少吗?
 

为了不让你感到难过,对每次询问你只要输出 2nn!2nn! 倍的 anan 对 998244353 取模后的结果即可。

输入描述:

第一行有两个整数 w 和 q ,其中 w 的含义如题意所述, q 表示接下来的询问次数。

接下来的 q 行,每行输入一个数 n 。
1≤w,n≤1061≤w,n≤106
1≤q≤1051≤q≤105

输出描述:

对于每一次询问, 在一行输出一个整数 v ,表示 v=2nn!⋅anmod 998244353v=2nn!⋅anmod 998244353

示例1

输入

1 2
1
2

输出

1
3

 

题意:

找规律

当n等于1的时候,每一项依次为  1  3  15  105  945  10395.......

当n等于2的时候,每一项依次为  2  6  30  210  1890  20790......

当n等于3的时候,每一项依次为  3  9  45  315   2835  31185......

从第二项开始每一项的结果为第一项乘 3  、 5  、 7  、9  、11 ...... 依次加2

思路:

数据量太大,打表会T

可以对乘项进行打表,即对  3 、 5  、 7 、 9 、 11 ...... 打表

利用同余定理

 

CODE:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef long long LL;
using namespace std;
#define memset(a,n) memset(a,n,sizeof(a))
#define INF 0x3f3f3f3f

const LL mod = 998244353;

LL dp[1000005];


int main()
{
    LL w,q,n;
    cin>>w>>q;

    LL x=1;
    dp[0]=1;
    for(LL i=1;i<=1000000;i++){
        dp[i]=((dp[i-1]%mod)*(x%mod))%mod;
        x=(x%mod)+2;
        if(dp[i]>n;
        LL y;
        y=((w%mod)*(dp[n]%mod))%mod;
        cout<

 

你可能感兴趣的:(ACM,----,题解)