给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4…;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过10000的待分类的正整数。数字间以空格分隔。
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。
13 1 2 3 4 5 6 7 8 9 10 20 16 18
30 11 2 9.7 9
按题目意思进行模拟…
#include
using namespace std;
int main()
{
int n,x;
while(~scanf("%d",&n)){
int a[10]={0},aa[10]={0},f=1,num=0;
for(int i=1;i<=n;++i){
scanf("%d",&x);
if(x%10==0) aa[0]=1,a[0]+=x;
else if(x%5==1) aa[1]=1,a[1]+=f*x,f=-f;
else if(x%5==2) aa[2]=1,++a[2];
else if(x%5==3) aa[3]=1,a[3]+=x,++num;
else if(x%5==4) aa[4]=1,a[4]=max(a[4],x);
}
for(int i=0;i<=4;++i){
if(aa[i]){
if(i==3)printf("%.1f",1.0*a[3]/num);
else printf("%d",a[i]);
}
else printf("N");
printf("%c",i==4?'\n':' ');
}
}
return 0;
}
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对位置相同的大写英文字母是第4个字母’D’,代表星期四(大写字符A到G表示星期一到星期日);第2对位置相同的大写字母(A-N)或数字(0-9)表示HH,这里相同的字母是’E’,是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、以及大写字母A到N表示);后面两字符串第1对相同的英文字母’s’(区分大小写)同时出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。
在一行中输出约会的时间,格式为“DAY HH:MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期
四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
THU 14:04
按题目意思进行模拟…
#include
using namespace std;
const int maxn=1e5+5;
char a[maxn],b[maxn],c[maxn],d[maxn];
char day[8][5]={"","MON","TUE","WED","THU","FRI","SAT","SUN"};
int main(){
scanf("%s %s %s %s",a+1,b+1,c+1,d+1);
int la=strlen(a+1),lb=strlen(b+1),lc=strlen(c+1),ld=strlen(d+1);
int ans1=0,ans2,ans3;
for(int i=1;i<=min(la,lb);++i){
if(a[i]!=b[i])continue;
if(ans1==0){//第一个相同的字符
if(a[i]>='A'&&a[i]<='Z')
ans1=a[i]-'A'+1;
}else{//第二个相同字符
if(a[i]>='0'&&a[i]<='9'){
ans2=a[i]-'0';
break;
}else if(a[i]>='A'&&a[i]<='Z'){
ans2=a[i]-'A'+10;
break;
}
}
}
for(int i=1;i<=min(lc,ld);++i){
if((c[i]>='A'&&c[i]<='Z'||c[i]>='a'&&c[i]<='z')&&c[i]==d[i]){
ans3=i-1;
break;
}
}
printf("%s %02d:%02d\n",day[ans1],ans2,ans3);
return 0;
}
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之
小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
输入第1行给出3个正整数,分别为:N(<=10^5),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格
被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到
但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼
亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。
随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。
输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90
才德全尽>德胜才>才德兼亡 但尚有 德胜才>普通>无资格
用一个变量代表成绩类型
比如:
才德全尽->3
德胜才->2
才德兼亡 但尚有 德胜才->1
普通->0
先按类型降序,类型相同按总分排序,总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
准考证号可能有前导0
如果用整型变量存储的话需要格式控制 %08d
#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int l,h;
struct node{
int id,d,c,s,type;
bool operator<(const node x)const{
if(type!=x.type)
return type>x.type;
if(s!=x.s)
return s>x.s;
if(d!=x.d)
return d>x.d;
return id<x.id;
}
}w[maxn];
int main()
{
int id,n,cnt,d,c;
while(~scanf("%d %d %d",&n,&l,&h)){
cnt=0;
for(int i=1;i<=n;++i){
scanf("%d %d %d",&id,&d,&c);
if(d<l||c<l)continue;
w[++cnt].id=id;
w[cnt].d=d;
w[cnt].c=c;
w[cnt].s=d+c;
if(d>=h&&c>=h){
w[cnt].type=3;
}else if(d>=h&&c<h){
w[cnt].type=2;
}else if(d<h&&c<h&&d>=c){
w[cnt].type=1;
}else{
w[cnt].type=0;
}
}
sort(w+1,w+cnt+1);
printf("%d\n",cnt);
for(int i=1;i<=cnt;++i){
printf("%08d %d %d\n",w[i].id,w[i].d,w[i].c);
}
}
return 0;
}
大家应该都会玩“锤子剪刀布”的游戏:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入第1行给出正整数N(<=10^5),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
5 3 2
2 3 5
B B
两两个人比赛,对方的胜场就是自己的败场,平局场数等于比赛场数减去两方的胜场
所以可以将问题简化,子需要分别知道两方的胜场就知道两方的败场和平局场数
所以用两个数组分别统计两个人出某一个手势的胜场
如:
num1[0]表示甲出布胜场
num1[1]表示甲出剪刀胜场
num1[2]表示甲出石头胜场
num2[0]表示乙出布胜场
num2[1]表示乙出剪刀胜场
num2[2]表示乙出石头胜场
最后循环取最大值,就获得了胜算最大的手势
#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int main()
{
int n;
char f[5]={'B','C','J'};
while(~scanf("%d",&n)){
char a[2],b[2];
int num1[3]={0},num2[3]={0};
for(int i=1;i<=n;++i){
scanf("%s %s",a,b);
if(a[0]==b[0])continue;//相等跳过
if(a[0]=='B'&&b[0]=='C')++num1[0];
else if(a[0]=='C'&&b[0]=='J')++num1[1];
else if(a[0]=='J'&&b[0]=='B')++num1[2];
else if(b[0]=='B'&&a[0]=='C')++num2[0];
else if(b[0]=='C'&&a[0]=='J')++num2[1];
else ++num2[2];
}
int ans1=0,ans2=0,ma1=0,ma2=0,id1,id2;
for(int i=0;i<3;++i){
ans1+=num1[i];
if(num1[i]>ma1)
ma1=num1[i],id1=i;
}
for(int i=0;i<3;++i){
ans2+=num2[i];
if(num2[i]>ma2)
ma2=num2[i],id2=i;
}
int p=n-ans1-ans2;
printf("%d %d %d\n",ans1,p,ans2);
printf("%d %d %d\n",ans2,p,ans1);
printf("%c %c\n",f[id1],f[id2]);
}
return 0;
}
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得 72 + 45/2 = 94.5(亿元)。
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数D表示市场最大需求量。随后一行给出N个正实数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正实数表示每种月饼的总售价(以亿元为单位)。数字间以空格分隔。
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
3 20
18 15 10
75 72 45
94.50
#include
#define ll long long
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
struct node{
double w,v;
bool operator<(const node x)const{
return v*x.w>x.v*w;
}
};
node s[maxn];
int main()
{
int n;
double d;
while(~scanf("%d %lf",&n,&d)){
for(int i=1;i<=n;++i)
scanf("%lf",&s[i].w);
for(int i=1;i<=n;++i)
scanf("%lf",&s[i].v);
sort(s+1,s+n+1);
double ans=0;
for(int i=1;i<=n;++i){
if(d>=s[i].w){
ans+=s[i].v;
d-=s[i].w;
}else{
ans+=s[i].v/s[i].w*d;
break;
}
}
printf("%.2lf\n",ans);
}
return 0;
}
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递
增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入在一行给出1个正整数N(N<=1e5)和一个符号,中间以空格分隔。
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
19 *
*****
***
*
***
*****
2
按题目意思模拟…
#include
using namespace std;
int main()
{
int n,m,now;
char x;
while(~scanf("%d %c",&n,&x)){
m=n-1,now=3;
while(m>=now*2){
m-=now*2;
now+=2;
}
now-=2;//第一行的符号数
int num=now,blank=0;
//上三角
while(num>1){
for(int i=1;i<=blank;++i)putchar(' ');//输出每行的空格
for(int i=1;i<=num;++i)putchar(x);//输出每行的字符
putchar('\n');
num-=2;//每行字符数少2
++blank;//空格数多一
}
//下三角
while(num<=now){
for(int i=1;i<=blank;++i)putchar(' ');
for(int i=1;i<=num;++i)putchar(x);
putchar('\n');
num+=2;//每行字符数多2
--blank;//空格数少一
}
printf("%d\n",m);
}
return 0;
}
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:
给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。
10个数字的总个数不超过200,且至少拥有1个非0的数字。
在一行中输出能够组成的最小的数。
2 2 0 0 0 3 0 0 1 0
10015558
贪心,先找到大于0的最小整数。作为第一个数字,其余数字按小到大输出
#include
using namespace std;
int main()
{
int x,num[15]={0};
for(int i=0;i<=9;++i)
scanf("%d",&num[i]);
for(int i=1;i<=9;++i){
if(num[i]){//找到大于0的最小整数
printf("%d",i);
--num[i];
break;
}
}
for(int i=0;i<=9;++i){
while(num[i]){//其余数字按小到大输出
--num[i];
printf("%d",i);
}
}
putchar('\n');
return 0;
}
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。
2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
多组输入,每组数据一行,每行给出正方形边长N(3<=N<=20)和组成正方形边的某种字符C,间隔一个空格。
输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
每组数据后空一行
10 a
aaaaaaaaaa
a a
a a
a a
aaaaaaaaaa
按题目意思进行模拟…
#include
using namespace std;
int main()
{
int n;
char c;
while(~scanf("%d %c",&n,&c)){
int col=(int)(1.0*n/2+0.5);//四舍五入
int row=n;
for(int j=1;j<=row;++j)
putchar(c);
putchar('\n');
for(int i=1;i<=col-2;++i){
putchar(c);
for(int j=1;j<=row-2;++j)//输出中间空格
putchar(' ');
putchar(c);
putchar('\n');
}
for(int j=1;j<=row;++j)
putchar(c);
printf("\n\n");
}
return 0;
}