2017年团体程序设计天梯赛 -【大区赛】

xiaoxiao2021-02-28  23

L1-1. 出生年

题意

以上是新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。  输入格式  输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在[1, 3000]之间,n可以是2、或3、或4。注意不足4位的年份要在前面补零,例如公元1年被认为是0001年,有2个不同的数字0和1。  输出格式  根据输入,输出x和能达到要求的年份。数字间以1个空格分隔,行首尾不得有多余空格。年份要按4位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“2013”被视为满足“4位数字都不同”的条件,但不被视为满足2位或3位数字不同的条件。  输入样例1  1988 4  输出样例1  25 2013  输入样例2  1 2  输出样例2  0 0001

思路 - 枚举

从y年枚举到3000年,若年份不足4位数补全到四位数求出不同数字个数,若个数满足==n,则输出年份和年龄.

#include<iostream> #include<string.h> using namespace std; //返回该年不同的数字个数,若年份不足4位,则必有0 int returnDf(int year) { int temp[10],dfSize=0; memset(temp,0,sizeof(temp)); if(year<1000) temp[0]=1; while(year>=10) { temp[year]++; year=year/10; } temp[year]++; for(int i=0;i<=9;i++) if(temp[i]!=0) dfSize++; return dfSize; } int main() { int y,n,i,judge[]={10,100,1000,10000}; cin>>y>>n; for(i=y;i<=9999;i++) { if(returnDf(i)==n) break; } cout<<i-y<<" "; //判断位数,按情况补0打印 for(int j=0;j<=3;j++) { if(i<judge[j]) { for(int k=0;k<3-j;k++) cout<<'0'; break; } } cout<<i<<endl; return 0; }

L1-2. 点赞

题意

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。  输入格式  输入在第一行给出一个正整数N(<=1000),是该用户点赞的博文数量。随后N行,每行给出一篇被其点赞的博文的特性描述,格式为“K F1 … FK”,其中 1<=K<=10,Fi(i=1, …, K)是特性标签的编号,我们将所有特性标签从1到1000编号。数字间以空格分隔。  输出格式  统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。  输入样例  4  3 889 233 2  5 100 3 233 2 73  4 3 73 889 2  2 233 123  输出样例  233 3

思路 - 统计

在输入数字的时候用一个一维数组统计出现次数。

#include<iostream> #include<string.h> using namespace std; int main() { int n,ans[1001],temp,count; memset(ans,0,sizeof(ans)); cin>>n; //统计出现次数 for(int i=0;i<n;i++) { cin>>count; for(int j=0;j<count;j++) { cin>>temp; ans[temp]++; } } //从最大数开始找出现次数最多的数字 int Max=-1,num; for(int i=1000;i>0;i--) { if(ans[i]>Max) { Max=ans[i]; num=i; } } cout<<num<<" "<<Max; return 0; }

L1-3. 情人节

题意

以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。  输入格式  输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过10个英文字母的非空单词,以回车结束。一个英文句点“.”标志输入的结束,这个符号不算在点赞名单里。  输出格式  根据点赞情况在一行中输出结论:若存在第2个人A和第14个人B,则输出“A and B are inviting you to dinner…”;若只有A没有B,则输出“A is the only one for you…”;若连A都没有,则输出“Momo… No one is for you …”。  输入样例1  GaoXZh  Magi  Einst  Quark  LaoLao  FatMouse  ZhaShen  fantacy  latesum  SenSen  QuanQuan  whatever  whenever  Potaty  hahaha  .  输出样例1  Magi and Potaty are inviting you to dinner…  输入样例2  LaoLao  FatMouse  whoever  .  输出样例2  FatMouse is the only one for you…  输入样例3  LaoLao  .  输出样例3  Momo… No one is for you …

思路 - 喵喵???

如题分三种情况,①2和14都没    ②只有2    ③2和4都存在

#include<iostream> using namespace std; int main() { int key=1; char name[1000][11]; //循环输入直到遇到'.' while(cin>>name[key]) { if(name[key][0]=='.') break; key++; } //按名字个数分类讨论 if(key<=2) cout<<"Momo... No one is for you..."<<endl; else if(key<=14) cout<<name[2]<<" is the only one for you..."<<endl; else cout<<name[2]<<" and "<<name[14]<<" are inviting you to dinner..."<<endl; return 0; }

L1-4. A乘以B

题意

看我没骗你吧 —— 这是一道你可以在10秒内完成的题:给定两个绝对值不超过100的整数A和B,输出A乘以B的值。  输入格式  输入在第一行给出两个整数A和B(-100 <= A, B, <= 100),数字间以空格分隔。  输出格式  在一行中输出A乘以B的值。  输入样例  -8 13  输出样例  -104

思路 - 喵喵喵?

按照题意输出aba∗b的值。

#include<iostream> using namespace std; int main() { int A,B; cin>>A>>B; cout<<A*B<<endl; return 0; }

L1-5. A除以B

题意

真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。  输入格式:  输入在第一行给出两个整数A和B(-100 <= A, B, <= 100),数字间以空格分隔。  输出格式:  在一行中输出结果:如果分母是正数,则输出“A/B=商”;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为“Error”。输出的商应保留小数点后2位。  输入样例1  -1 2  输出样例1  -1/2=-0.50  输入样例2  1 -3  输出样例2  1/(-3)=-0.33  输入样例3  5 0  输出样例3  5/0=Error

思路 - 喵喵喵??

如题

#include<iostream> #include<iomanip> using namespace std; int main() { double A,B; cin>>A>>B; if(B>0) cout<<A<<"/"<<B<<"="<<fixed<<setprecision(2)<<A/B<<endl; else if(B==0) cout<<A<<"/"<<B<<"=Error"<<endl; else cout<<A<<"/("<<B<<")"<<"="<<fixed<<setprecision(2)<<A/B<<endl; return 0; }

L1-6. 新世界

题目链接

题意

这道超级简单的题目没有任何输入。  你只需要在第一行中输出程序员钦定名言“Hello World”,并且在第二行中输出更新版的“Hello New World”就可以了。

思路 - 喵喵喵??

exm

#include<iostream> using namespace std; int main() { cout<<"Hello World"<<endl <<"Hello New World"<<endl; return 0; }

L1-7. 古风排版

题目链接

题意

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。  输入格式  输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。  输出格式  按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)  输入样例  4  This is a test case  输出样例  asa T   st ih   e tsi  ce s

思路 - 二维矩阵翻转

先行优先把输入的值赋值到一个二维矩阵,每行n个字符,随后翻转矩阵输出

#include<iostream>  #include<string.h> using namespace std;      int main()   {       char p[1000],ans[100][1000],ch;       int n,len=0,key=0;     memset(ans,' ',sizeof(ans));     cin>>n;       getchar();  //忽略本次输入的回车              while((ch=getchar())!='\n')           p[len++]=ch;                  //按照每行n个字符赋值给ans二维数组       int row=0;       while(key<len)       {           for(int i=0;i<n;i++)           {               if(key>=len)                   break;               ans[row][i]=p[key++];           }           row++;     }               //翻转输出矩阵的字符       for(int i=0;i<n;i++)       {           for(int j=row-1;j>=0;j--)               cout<<ans[j][i];           cout<<endl;       }        return 0;   }   

L1-8. 最佳情侣身高差

题目链接

题意

专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)×1.09=(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。  下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。  输入格式  输入第一行给出正整数N(<=10),为前来查询的用户数。随后N行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 [1.0, 3.0] 之间的实数。  输出格式  对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后2位。  输入样例  2  M 1.75  F 1.8  输出样例  1.61  1.96

思路 - 喵喵喵??

男=女*1.09

#include<iostream> #include<iomanip> using namespace std; int main() { int n; double high; char sex; cin>>n; for(int i=0;i<n;i++) { cin>>sex>>high; //按照性别选择式子,注意保留两位小数 switch(sex) { case 'M': cout<<fixed<<setprecision(2)<<high/1.09<<endl; break; case 'F': cout<<fixed<<setprecision(2)<<high*1.09<<endl; } } return 0; }

L2-1. 人以群分

题意

社交网络中我们给每个人定义了一个“活跃度”,现希望根据这个指标把人群分为两大类,即外向型(outgoing,即活跃度高的)和内向型(introverted,即活跃度低的)。要求两类人群的规模尽可能接近,而他们的总活跃度差距尽可能拉开。  输入格式:  输入第一行给出一个正整数N(2 <= N <= 105)。随后一行给出N个正整数,分别是每个人的活跃度,其间以空格分隔。题目保证这些数字以及它们的和都不会超过231。  输出格式:  按下列格式输出

Outgoing #: N1  Introverted #: N2  Diff = N3  其中 N1 是外向型人的个数;N2 是内向型人的个数;N3 是两群人总活跃度之差的绝对值。  输入样例1  10  23 8 10 99 46 2333 46 1 666 555  输出样例1  Outgoing #: 5  Introverted #: 5  Diff = 3611  输入样例2  13  110 79 218 69 3721 100 29 135 2 6 13 5188 85  输出样例2  Outgoing #: 7  Introverted #: 6  Diff = 9359

思路 - 贪婪算法

因为两群人的差的绝对值要求最大,且人数相差最小。那么可以先把活跃度从小到大排序,内向人群活跃度为较小部分(0~mid)之和,外向人群为活跃度为较大部分(mid+1~n-1)之和,mid=n/2达到人数相差最小。

#include<iostream> #include<string.h> #include<algorithm> using namespace std; int main() { int n,degree[120000]; cin>>n; memset(degree,0,sizeof(degree)); for(int i=0;i<n;i++) cin>>degree[i]; //从小到大排序 sort(degree,degree+n); int Min=0,Max=0,mid=n/2; for(int i=0;i<mid;i++) Min=Min+degree[i]; for(int i=mid;i<n;i++) Max=Max+degree[i]; cout<<"Outgoing #: "<<n-mid<<endl <<"Introverted #: "<<mid<<endl <<"Diff = "<<Max-Min<<endl; return 0; }

呜,因为评测时间没了所以写不完坑辣QAQ 哭唧唧

转载请注明原文地址: https://www.6miu.com/read-2629987.html

最新回复(0)