洛谷 字符串&&数论 水一波

95 篇文章 1 订阅
77 篇文章 0 订阅

洛谷 P2814 家谱

题目背景
现代的人对于本家族血统越来越感兴趣。
题目描述
给出充足的父子关系,请你编写程序找到某个人的最早的祖先。
输入输出格式
输入格式:
输入由多行组成,首先是一系列有关父子关系的描述,其中每一组父子关系中父亲只有一行,儿子可能有若干行,用#name的形式描写一组父子关系中的父亲的名字,用+name的形式描写一组父子关系中的儿子的名字;接下来用?name的形式表示要求该人的最早的祖先;最后用单独的一个$表示文件结束。

输出格式:
按照输入文件的要求顺序,求出每一个要找祖先的人的祖先,格式:本人的名字+一个空格+祖先的名字+回车。

输入输出样例

输入样例#1:
George
+Rodney
Arthur
+Gareth
+Walter
Gareth
+Edward
?Edward
?Walter
?Rodney
?Arthur
$
输出样例#1:
Edward Arthur
Walter Arthur
Rodney George
Arthur Arthur
说明

规定每个人的名字都有且只有6个字符,而且首字母大写,且没有任意两个人的名字相同。最多可能有1000组父子关系,总人数最多可能达到50000人,家谱中的记载不超过30代。

#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
map<string,string>p;
string find(string x) {
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
string s,s1;
int main() {
    char ch;
    cin>>ch;
    while(ch!='$') {
        cin>>s;
        if(ch=='#') {
            s1=s;
            if(p[s]=="") p[s]=s;
        }
        else if(ch=='+') p[s]=s1;
        else cout<<s<<' '<<find(s)<<endl;
        cin>>ch;
    }
    return 0;
}

洛谷 P2580 于是他错误的点名开始了

题目背景
XS中学化学竞赛组教练是一个酷爱炉石的人。
他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。
题目描述
这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)
输入输出格式
输入格式:
第一行一个整数 n,表示班上人数。接下来 n 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 50)。第 n+2 行一个整数 m,表示教练报的名字。接下来 m 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 50)。
输出格式:
对于每个教练报的名字,输出一行。如果该名字正确且是第一次出现,输出“OK”,如果该名字错误,输出“WRONG”,如果该名字正确但不是第一次出现,输出“REPEAT”。(均不加引号)
输入输出样例
输入样例#1:
5
a
b
c
ad
acd
3
a
a
e
输出样例#1:
OK
REPEAT
WRONG
说明
对于 40%的数据,n≤1000,m≤2000;
对于 70%的数据,n≤10000,m≤20000;
对于 100%的数据, n≤10000,m≤100000。
T1总是送分的。

//map 是个好东西 希望人人都会
#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<string>
using namespace std;
map<string,bool> mmp;
map<string,int> mp;
int n,m;
string namex;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        cin>>namex;
        mmp[namex]=true;
        mp[namex]=1;
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        cin>>namex;
        if(mmp[namex]==true&&mp[namex]==1){
            printf("OK\n");mp[namex]++;
        }
        else if(!mmp[namex]) printf("WRONG\n");
        else printf("REPEAT\n");
    }
    return 0;
}

P1372 又是毕业季I

题目背景

“叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌。1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定是一生最难忘的时刻!

题目描述

为了把毕业晚会办得更好,老师想要挑出默契程度最大的k个人参与毕业晚会彩排。可是如何挑呢?老师列出全班同学的号数1,2,……,n,并且相信k个人的默契程度便是他们的最大公约数(这不是迷信哦~)。这可难为了他,请你帮帮忙吧!

PS:一个数的最大公约数即本身。

输入输出格式

输入格式:
两个空格分开的正整数n和k。(n>=k>=1)

输出格式:
一个整数,为最大的默契值。

输入输出样例

输入样例#1:
4 2
输出样例#1:
2
说明

【题目来源】

lzn原创

【数据范围】

对于20%的数据,k<=2,n<=1000

对于另30%的数据,k<=10,n<=100

对于100%的数据,k<=1e9,n<=1e9(神犇学校,人数众多)

#include<iostream>
#include<cstdio>
using namespace std;
long long n,k;
int main(){
    cin>>n>>k;
    cout<<n/k;
    return 0;
}

P1414 又是毕业季II

题目背景

“叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌。1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定是一生最难忘的时刻!

题目描述

彩排了一次,老师不太满意。当然啦,取每位同学的号数来找最大公约数显然不太合理。于是老师给每位同学评了一个能力值。于是现在问题变为,从n个学生中挑出k个人使得他们的默契程度(即能力值的最大公约数)最大。但因为节目太多了,而且每个节目需要的人数又不知道。老师想要知道所有情况下能达到的最大默契程度是多少。这下子更麻烦了,还是交给你吧~

PS:一个数的最大公约数即本身。

输入输出格式

输入格式:
第一行一个正整数n。

第二行为n个空格隔开的正整数,表示每个学生的能力值。

输出格式:
总共n行,第i行为k=i情况下的最大默契程度。

输入输出样例

输入样例#1:
4
1 2 3 4
输出样例#1:
4
2
1
1
说明

【题目来源】

lzn原创

【数据范围】

记输入数据中能力值的最大值为inf。

对于20%的数据,n<=5,inf<=1000

对于另30%的数据,n<=100,inf<=10

对于100%的数据,n<=10000,inf<=1e6

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[1000000+10],c[100000+10],Max,cnt,n;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c-'0');c=getchar();}
    return x*f;
}
int main(){
    n=read();
    for(int x,i=1;i<=n;i++){ x=read();a[x]++;Max=max(Max,x); }
    for(int i=1;i<=Max;i++){
        cnt=0;
        for(int j=1;i*j<=Max;j++) cnt+=a[i*j];
        for(int j=1;j<=cnt;j++) c[j]=max(c[j],i);
    }
    for(int i=1;i<=n;i++) printf("%d\n",c[i]);
    return 0;
}
/*
a数组记录每个可能的能力值出现的次数 c数组表示选取i个人时能够得到的最大默契度
枚举能力值1-Max,暴力计算其倍数的出现次数cnt,然后与c[1-cnt]标记更新答案
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七情六欲·

学生党不容易~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值