lduoj_2021年初寒假训练第41场

A. 复制-粘贴

Description
小y是一个聪明的程序员,但是他懒到了极致,在输入程序时甚至不愿意多打一行代码。

有一次,小y发现他的一个程序需要输入n行一模一样的代码,怎么办呢?他首先输入了第1行,然后通过1次“复制-粘贴”命令得到了第2行,再通过1次“复制-粘贴”命令得到了第3-4行,…直到完成这n行代码的输入。小y懒得得意洋洋,正好遇到初学编程的小x,他就想考考小x,顺便为难为难他以炫耀自己的聪明才智和编程水平。于是把“复制-粘贴”的伎俩告诉小x,并让小x编程计算最少通过几次“复制-粘贴”命令可以得到正好n行的代码?

Input
一行一个正整数n,n在long int范围内。

Output
一行一个正整数,表示最少的“复制-粘贴”次数。

Samples
Input Copy
4
Output
2
要注意:
可以复制任意一段
贪心就好了,首先写1行,复制粘贴后得到2行,复制2行粘贴后得到四行,可以发现满足2的次方
直到总数 > n即可
Main_Code()

ll n;
int main()
{
    n = read;
    ll sum = 1;
    int ans = 0;
    while(sum < n){
        sum *= 2L;
        ans ++;
    }
    cout<<ans<<endl;
    return 0;
}

B. 足球联赛

Description
一个足球联赛由n只球队构成。在一个赛季中,每只球队都要与其它球队各比赛两场。一场比赛在主场,一场在客场。赢一场得3分,输一场不得分,平局两支队伍各得1分。现在,给你一个n∗n的矩阵表示比赛情况。第i行第j列的字母表示在第i只队伍主场的比赛情况,W表示主队赢,L表示主队输,D表示平局。需要你求出得分最高的队伍的编号,如果有分数相同的,在一行中按字典序输出队伍编号。

Input
第一行一个整数n,1<n≤50。

接下来n行每行n个字符,表示输赢情况。

第i行第i列为 - ,因为一只队伍不可能与自己比赛。

Output
得分最高的队伍编号。如有多个在一行中输出,用一个空格分开。

Samples
Input Copy

3 
-WW 
W-W 
WW-

Output
1 2 3
Input Copy

5 
-DWWD 
L-WLL 
DD-WD 
DDL-L 
DDLL-

Output
1

硬生生的模拟就好了(鄙人代码又臭又长)
在处理最大值的时候,可以先遍历得到最大值,然后在遍历一遍将等于最大值的元素从小到大输出
Main_Code()

int n;
char a[59][59];
int score[59];
struct node{
    int id;
    int sc;
}b[59];
bool cmp(node a,node b){
    if(a.sc != b.sc) return a.sc > b.sc;
    else return a.id < b.id;
}
int main()
{
    n = read;
    for(int i=1;i<=n;i++) cin >> a[i] + 1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
        {
            if(i == j) continue;
            if(a[i][j] == 'D') score[i] += 1,score[j] += 1;
            else if(a[i][j] == 'W') score[i] += 3;
            else score[j] += 3;
        }

    }
    for(int i=1;i<=n;i++){
        b[i].sc = score[i];
        b[i].id = i;
    }
    sort(b+1,b+1+n,cmp);
    int mx = b[1].sc;
    for(int i=1;i<=n;i++){
        if(b[i].sc == mx) printf("%d ",b[i].id);
    }
    return 0;
}

C. 捕食关系

Description
在海洋中,有食肉类的鱼和食草类的鱼,某种食肉类的鱼捕食食草类的鱼当且仅当自己的体重大于对方。 现在给出两类鱼各自的体重,求有多少对捕食关系。

Input
每组测试数据有三行。

第一行有两个整数m,n(1≤m,n≤20000),分别代表食肉类的鱼的种类数和食草类的鱼的种类数。
第二行m个数,
第三行n个数,代表各自的体重。
Output
一个整数,表示有多少对捕食关系。

Samples
Input Copy
5 3
8 1 7 3 1
3 6 1
Output
7

一个比较朴素的方法就是暴力,单数数据范围不允许,这样就可以直接二分即可
用lower_bound出了点小问题,用upper_bound过了
具体用法来自参考博客:博客
下面来自引用:从小到大排序后
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标
Main_Code()

ll a[20007],ans,b[20007];
int n,m;
int main()
{
    n =read,m=read;
    for(int i=1;i<=n;i++) a[i] = read;
    for(itn j=1;j<=m;j++) b[j] = read;
    sort(a+1,a+1+n);
    sort(b+1,b+1+m);
    for(int i=1;i<=m;i++){
        ll x = upper_bound(a+1,a+1+n,b[i]) - a - 1;
        ans += (n - x);
    }
    cout<<ans<<endl;
    return 0;
}

D. 幻方

Description
大家都知道n阶奇数幻方吧?如下为一个5阶幻方:

在这里插入图片描述

现在,输入奇数n,n<1000000,输出该奇数幻方最右下角的元素值。

Input
一行一个数n。

Output
一行一个数,表示该奇数幻方右下角的值。

Samples
Input Copy
5
Output
9

结果可能比较大,爆掉long long
这个是个结论题,记得初一的时候数学老师讲过幻方的一些性质,这个题的答案是(n + 1) * (n - 2) / 2
Main_Code()

	ll n = read;
    ll t1 = (n-2);
    ll t2 = n + 1;
    t2 /= 2;
    cout<<t2 * t1<<endl;

E. 求和

Description
小马克今年成为小学生。不久后她将进行她的第一次考试,其中包括数学考试。她非常认真地复习,她认为自己已经准备好了。她的哥哥通过给她提出问题并解决的方式帮助她。

他的问题是给定一连串整数:依次由1个1,2个2,3个 3 等组成,即1223334444……。现在他给马克两个整数A和B;他的任务是求出由第A个到第B个数的。如果A是1,B是3,答案为1+2+2=5。

给一个问题,然后计算它们的和,马克的哥哥能够验证答案正确与否。

Input
只有一行,包括正整数A和B,1≤A≤B≤1000
Output
共一行,为和的值。

Samples
Input Copy
1 3
Output
5
Input Copy
3 7
Output
15

看数据范围可以打表,然后求就完了
很简单的模拟
Main_Code()

ll aa[1007];
int main()
{
    int a=read,b=read;
    ll ans = 0;
    int cnt = 0;
    int lim = 1;
    for(int i=1;i<=1000;i++){
        cnt ++;
        aa[i] = lim;
        if(cnt == lim){
            cnt = 0;
            lim ++;
        }
    }
    ///for(int i=1;i<=10;i++) cout<<aa[i]<<endl;
    for(int i=a;i<=b;i++) ans += aa[i];
    cout<<ans<<endl;
    return 0;
}

F. 猜歌名

Description
“Guess the song” 是一项在年轻程序员中非常流行的游戏。它是一种集技能、智慧、耐性于一体的游戏。这个游戏给玩游戏的人放音乐,游戏者的目标是尽可能快地猜这首歌的歌名。

Mirko可能不是一个很好的程序员,但他是一个世界级的猜歌者。Mirko总是在专辑里的某首歌播放出至少一半歌词的时候猜出歌名。所有歌名的单词是唯一的(没有一个单词会出现一次或更多次)。

写一个程序,给出歌名和专辑名,看看Mirko在这首歌的哪个点上(在多少个单词之后)猜出歌名。

Input
共两行:

第一行:包含一个整数N,1≤N≤50,它是一首歌里的单词数目。

接下来的N行每一行包含歌名的一个单词。

第N+2行:包含一个整数M,1≤M≤10000, 它是专辑里的单词数目。

接下来的M行每一行包含专辑里的一个单词 歌名和专辑里的所有单词由1到15个小写英文字母组成。

注:测试数据将会使得Mirko总能从专辑里猜出歌曲名。

Output
共一行,包含一个数,表示Mirko在第几个单词处猜出歌曲名。

Samples
Input Copy

3 
sedam 
gladnih 
patuljaka 
7 
sedam 
dana 
sedam 
noci 
sedam 
gladnih 
godina

Output
6
Input Copy

4 
moj 
bicikl 
mali 
crveni 
11 
ja 
vozim 
bicikl
crvene 
boje 
ali 
je 
moj 
moj 
samo 
moj

Output
8

简单模拟,通过遍历下面的字符串,对上面的字符串进行标记,如果上面的字符串中超过一半被标记过,就可以直接输出当前遍历的字符串的下标
Main_Code()

int n,m;
int lim;
string a[55];
string b[10086];
int flag[55];
bool ck(){
    int cnt = 0;
    for(int i=1;i<=n;i++) if(flag[i]) cnt ++;
    if(cnt * 2 >= n) return true;
    return false;
}
int main()
{
    int pos = 0;
    n = read;

    if(n % 2) lim = n / 2 + 1;
    else lim = n / 2;
    for(int i=1;i<=n;i++) cin >> a[i];
    m = read;
    for(int i=1;i<=m;i++) cin >> b[i];
    for(int i=1;i<=m;i++){
        string temp = b[i];
        for(int j=1;j<=n;j++){
            if(temp == a[j]){
                flag[j] = 1;
                break;
            }
        }
        if(ck()){
            pos = i;
            break;
        }
    }
    cout<<pos<<endl;
    return 0;
}
posted @ 2021-02-25 23:39  PushyTao  阅读(301)  评论(0编辑  收藏  举报