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

来源:互联网 发布:淘宝店铺销量怎么看 编辑:程序博客网 时间:2024/06/10 19:11

洛谷 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]标记更新答案 */
原创粉丝点击