算法训练普通试题_第1页
算法训练普通试题_第2页
算法训练普通试题_第3页
算法训练普通试题_第4页
算法训练普通试题_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

试题编号ALGO-101

算法训练图形显示

问题描述

编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行

数):

*****

****

***

**

本题的C++参考代码如下:

#include<iostream>

usingnamespacestd;

intmain()

(

intn;

cin»n;

for(inti=0;i<n;i++)

for(intj=I;j<=n-i;j++)

(

cout«"*";

if(j<n-i)

cout«

else

cout«endl;

)

return0;

本题的c参考代码如下:

#include<stdio.h>

intmain()

{inti,j,allOOJllOOJ,n;

while(scanf("%d,',&n)!=EOF)

{for(i=0;i<n;i++)

for(j=0;j<n-i;j++)

(

printf("*");

if(j!=n-i-l)

printf(”");

if(j==n-l-i)

printf("\n");

)

试题编号ALGO-97

算法训练排序

问题描述

编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。

输入格式:输入只有一行,即三个整数,中间用空格隔开。

输出格式:输出只有一行,即排序后的结果。

输入输出样例

样例输入

9230

样例输出

3092

本题的C++参考代码如下:

#include<iostream>

usingnamespacestd;

intmain()

(

inta,b,t,c;

while(cin»a»b»c)

(

if(a<b)

(

t=a;a=b;b=t;

)

if(a<c)

(

t=a;a=c;c=t;

)

if(b<c)

(

t=b;b=c;c=t;

)

cout«a«',«b«,,«c«endl;

return0;

本题的c参考代码如下:

#include<stdio.h>

#include<stdlib.h>

#definenum100

intmain(void)

(

inti,j,t,a[3]={0};

for(i=0;i<3;i++)

{scanf("%dM,&a[iJ);

)

for(i=0;i<3;i++)

for(j=i;j<3;j++)

if(a[i]<=a[j]){t=a[i];a[i]=a[j];a[j]=t;}

for(i=0;i<3;i++)

{printf("%dn,a[i]);

if(i!=2)printf("'1);

)

printf(M\n");

return0;

试题编号ALGO-95

算法训练2的次塞表示

问题描述

任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。

将这种2进制表示写成2的次第的和的形式,令次事高的排在前面,可得到如下表达式:

137=2A7+2A3+2A0

现在约定寒次用括号来表示,即Sb表示为a(b)

此时,137可表示为:2(7)+2(3)+2(0)

进一步:7=2人2+2+2入0(27用2表示)

3=2+2人0

所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:1315=2八10+2八8+2A5+2+1

所以1315最后可表示为:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入格式

正整数(l<=n<=20000)

输出格式

符合约定的n的0,2表示(在表示中不能有空格)

样例输入

137

样例输出

2(2(2)+2+2(0))+2(2+2(0))+2(0)

样例输入

1315

样例输出

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

提示

用递归实现会比较简单,可以一边递归一边输出

本题的C++参考代码如下:

#include<iostream>

usingnamespacestd;

〃递归实现思路是先转换成二进制

intfun(intn)

inti=0;

inta[20]={0};

intm=n;

while(m)

{

a[i]=m%2;

m/=2;

i++;

)

for(intj=i-l;j>=O;j-)//高位到低位排列但是要注意每位的权改变

(

if(a|j]=l)

(

〃若是最后一个1则之后不要加号

intflag=l;

for(intk=j-l;k>=O;k—)

(

if(a[k]==l)

(

flag=O;

break;

}

)

if(flag)〃是最后一位

(

if(j==l)

cout«H2";

else

(

if(j==O)

coutvv"2(“vvj«")”;

else

(

cout«"2(";

fun(j);

cout«")M;

)

else〃不是最后一位

(

ifg)

cout«',2+M;

else

if)

cout«H2(n«j«n)+u;

else

(

cout«n2(M;

fun(j);

cout«")+";

)

return0;

I

intmain()

(

intn;

cin»n;

fun(n);

cout«endl;

return0;

本题的c参考代码如下:

#include<stdio.h>

int1=0;

chartemp[1000]={0};

voidshow(intn)

(

if(n==0){temp[l]=,0,;l++;retum;)

if(n==2){temp[l]=,2,,l+4-;return;}

inta[15]={0},i=0,j;

while(n!=0)

(

a[i]=n%2;

n/=2;

i++;

)

for(j=i-l;j>=0;j-)

if(a[j]==l)

if(j==D

(

if(temp[l-l]==')'IItemp[l-l]=='2,){temp[l]='+,;l++;}

temp[l]=,2,;l++;

)

else

(

if(temp[l-l]==')'IItemp[l-l]=='2'){temp[l]='+';l++;}

temp[l]='2,;l++;

temp[l]=,(,;l++;

show(j);

temp[l]=,),;l++;

intmain()

(

intn;

scanf("%d",&n);

show(n);

printf(M%s,temp);

return0;

试题编号ALGO-92

算法训练前缀表达式

问题描述

编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。输入格式为:“运

算符对象1对象2”,其中,运算符为“+”(加法)、(减法)、“*”(乘法)或

“/”(除法),运算对象为不超过10的整数,它们之间用一个空格隔开。要求:对于加、

减、乘、除这四种运算,分别设计相应的函数来实现。

输入格式:输入只有一行,即一个前缀表达式字符串。

输出格式:输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果

为整数)。

输入输出样例

样例输入

+52

样例输出

7

本题的C++参考代码如下:

#include<iostream>

usingnamespacestd;

intmain()

charc;

inta,b;

cin»c»a»b;

intres;

if(c==,+,)res=a+b;

elseif(c==,-,)res=a-b;

elseif(c=='*')res=a*b;

elseres=a/b;

cout«res;

return0;

本题的c参考代码如下:

#include<stdio.h>

intmain()

{inta[2];

inti,j;

charc=getchar();

for(i=0;i<2;i++)

scanfC'%dn,&a[i]);

if(c==,+')

j=a[O]+a[l];

elseif(c==-*)

j=a[O]-a[l];

elseif(c==,*1)

j=a[O]*a[l];

elseif(c=='/')

j=a[O]/a[l];

printf("%d\j);

retum0;

)

试题编号ALGO-91

算法训练Anagrams问题

问题描述

Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不

区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear"、“Rimon”和“MinOR”

都是Anagramso编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams»

每一个单词的长度不会超过80个字符,而且是大小写无关的。

输入格式:输入有两行,分别为两个单词。

输出格式:输出只有一个字母Y或N,分别表示Yes和No。

输入输出样例

样例输入

Unclear

Nuclear

样例输出

Y

本题的C++参考代码如下:

#include<iostream>

#include<cmath>

#include<string>

#include<windows.h>

#include<stack>

#include<vector>

#include<iomanip>

#include<stack>

#include<set>

#include<map>

usingnamespacestd;

charGetCapital(charc)

(

if(c<=,Z,)

returnc;

else

return

)

intmain(intargc,char**argv){

map<char,int>a,b;

stringt;

cin»t;

for(inti=O;i<t.length();i++)

a[GetCapital(t[i])]++;

cin»t;

for(inti=O;i<t.length();i++)

b[GetCapital(t[i])]++;

if(a==b)

cout«uYn;

else

cout«uNn;

return0;

}

本题的c参考代码如下:

#include<stdio.h>

voidsort(chara[],intlen)

(

inti,j,max;

for(i=0;i<len;i++)

(

max=i;

for(j=i+1;j<len;j++)

if(a[j]>a[max])max=j;

j=a[i];a[i]=a[max];a[max]=j;

)

)

voidstrtoupper(chara[],intlen)

(

inti;

for(i=0;i<len;i++)

if(a[i]>='a'&&a[i]<=,z')a[i]-=32;

)

intmystrcmp(chara[],int11,charb[],int12)

(

if(ll!=12)return0;

inti;

for(i=0;i<ll;i++)

if(a[i]!=b[i])return0;

return1;

intmystrlen(char*p)

{

int1=0;

while(*p++!=0)

1++;

return1;

}

intmain()

(

charsl[l000]={0},s2[l000]={0};

int11,12;

scanf(H%s%s",sl,s2);

ll=mystrlen(sl);

12=mystrlen(s2);

strtoupper(sl,ll);

strtoupper(s2,12);

sort(sl,ll);

sort(s2,12);

if(mystrcmp(s1,11,s2,12))printf(uYn);

elseprintf(”N");

return0;

试题编号ALGO-90

算法训练出现次数最多的整数

问题描述

编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N

也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多

的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印

比较小的那个值。

输入格式:第一行是一个整数N,N£20;接下来有N行,每一行表示一个整数,

并且按照从小到大的顺序排列。

输出格式:输出只有一行,即出现次数最多的那个元素值。

输入输出样例

样例输入

5

100

150

150

200

250

样例输出

150

本题的C++参考代码如下:

#include“iostream”

#includeustring"

usingnamespacestd;

inimain()

(

intn;

cin»n;

if(n<=0)return0;

string*a=newstring[n];

inti;

for(i=0;i<n;++i)

cin»a[i];

stringnumber=a[0];

intcount=1;

intflag=1;

for(i=1;i<n;++i)

(

if(a[i].compare(a[i-1])==0)

flag=flag+1;

if(a[i].compare(a[i-1])==0IIi==n-1)

(

if(flag>count)

(

count=flag;

number=a[i-1];

)

flag=1;

)

}

cout«number«endl;

return0;

)

本题的c参考代码如下:

#include<stdio.h>

intmain()

(

intn,ij,t,max=1,num=0;

scanf("%d”,&n);

if(n>0)

(

inta[n];

for(i=0;i<n;i++)

scanf(n%dn,a+i);

j=num=a[0];

t=l;

for(i=l;i<n;i++)

if(a[i]==j)

(

++t;

if(t>max)

max=t;num=a[i];

else

t=l;

j=a[i];

)

printf("%d",num);

return0;

}

试题编号ALGO-87

算法训练字串统计

问题描述

给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多

的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次

出现最早的。

输入格式

第一行一个数字L。

第二行是字符串So

L大于0,且不超过S的长度。

输出格式

一行,题目要求的字符串。输入样例1:

4

bbaabbaaaaa输出样例1:

bbaa输入样例2:

2

bbaabbaaaaa输出样例2:

aa

数据规模和约定

n<=60

S中所有字符都是小写英文字母。提示

枚举所有可能的子串,统计出现次数,找出符合条件的那个

本题的C++参考代码如下:

#include<cstdio>

#include<cstring>

intmain()

chars[65],str[65];

intmax=O,t,n,len;

scanf(u%d%sn,&n,s);

len=strlen(s);

if(n<=len)

(

charss[65],tt[65];

for(inti=len;i>=n;i-)

(

ss[i]=tt[i]=^r;

for(intj=O;j<=len-i;j++)

(

t=l;

for(intk=O;k<i;k++)

ss[k]=s[k+j];

for(intx=j+1;x<=len-i;x++)

(

for(inty=O;y<i;y++)

tt[y]=s[y+x];

if(strcmp(ss,tt)==O)

t++;

)

if(t>max)

(

max=t;

strcpy(str,ss);

//printf(M%s\nn,str);

)

}

)

printf(H%s\nH,str);

本题的c参考代码如下:

#include<stdio.h>

#include<string.h>

intmain(){

charS[1OOO],str[l000][1000],temp[l00],out[100];

intL,i=0,s,otongji=0,ttongji,a,b,c;

scanf("%d%c%c,\&L,&S[0],&S[0]);

while(S[i]!=\n!){

scanf(n%cM,&S[i+l]);

i++;

sm=vr;

for(s=i+l;L<=s;L++){

for(a=0;a<s+1-L;a++){〃赋值

for(b=0;b<L;b++){

str[a][b]=S[a+b];

)

str[a][b]=W;

for(i=0;i<a-l;){〃比较

for(b=O;b<a;b++){

if(str[b][O]!='\O'){

for(c=O;c<L;c++){

temp[c]=str[b][c];

)

temp[c]='\0";

ttongji=1;

i++;

str[b][0]=V)';

break;

)

)

for(b++;b<a;b++){

if(!strcmp(str[b],temp)){

ttongji++;

i++;

str[b][01='0';

if(ttongji>

otongjill(ttongji==otongji&&strlen(temp)>strlen(out))){

strcpy(out,temp);

otongji=ttongji;

)

)

i=0;

while(out[i]!=W){

printf("%c”,out[i]);

i++;

getchar();

return0;

)

试题编号ALGO-86

算法训练矩阵乘法

问题描述

输入两个矩阵,分别是m*s,s*n大小。输出两个矩阵相乘的结果。

输入格式

第一行,空格隔开的三个正整数m,s,n(均不超过200)。

接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j)o

接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)o

输出格式

m行,每行n个空格隔开的整数,输出相乘彳爰的矩阵C(i,j)的值。

样例输入

232

10-1

11-3

03

12

31

样例输出

-32

-82

提示

矩阵C应该是m行n歹U,其中C(i,j)等于矩阵A第i行行向量与矩阵B第j列列向量的内积。

例如样例中C(l,1)=(1,0,-1)*(0,1,3)=1*0+0*1+(-1)*3=3

本题的C++参考代码如下:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<ctype.h>

intmain()

(

intm,s,n;

intsum=0;

int

inta[200][200],b[200][200],c[200][200];

scanf("%d%d%d",&m,&s,&n);

for(i=0;i<m;i++)

(

for(j=0;j<s;j++)

scanf("%d",&a[i][j]);

I

for(i=0;i<s;i++)

{

for(j=0;j<n;j++)

scanf("%d",&b[i][j]);

for(i=0;i<m;i++)

(

for(j=0;j<n;j++)

(

for(l=0;l<s;l++)

(

sum+=(a[i][l]*b[l]|j]);

)

c[i]|j]=sum;

sum=0;

)

)

for(i=0;i<m;i++)

(

for(j=0;j<n;j++)

printf("%d",c[i][j]);

printf("\n");

I

return0;

本题的c参考代码如下:

#include<stdio.h>

intmain(){

intm,s,n,ij,k,a[200][200],b[200][200],c[200][200];

scanf(H%d%d%dM,&m,&s,&n);

for(i=1;i<=m;i++){

for(j=l;j<=s;j++)

scanf(n%dM,&a[i][j]);

for(i=l;i<=s;i++){

for(j=l;j<=n;j++)

scanf("%d",&b[i][j]);

)

for(i=l;i<=m;i++){

for(j=1;j<=n;j++)

c[i][j]=O;

}

for(i=l;i<=m;i++){

for(j=l;j<=n;j++){

for(k=1;k<=s;k++){

c[i][j]=c[i][j]+a[i][k]*b[k][j];

)

)

I

for(i=l;i<=m;i++){

for(j=l;j<=n;j++)

printf("%d",c[i][j]);

printf("\n");

return0;

试题编号ALGO-84

算法训练大小写转换

问题描述

编写一个程序,输入一个字符串(长度不超过20),然后把这个字符串内的每一个字

符进行大小写变换,即将大写字母变成小写,小写字母变成大写,然后把这个新的字符串输

出。

输入格式:输入一个字符串,而且这个字符串当中只包含英文字母,不包含其他类型的

字符,也没有空格。

输出格式:输出经过转换后的字符串。

输入输出样例

样例输入

AeDb

样例输出

aEdB

本题的C++参考代码如下:

#include<iostream>

#include<string>

usingnamespacestd;

intmain()

(

stringstr;

cin»str;

unsignedi;

for(i=0;i<str.size();i++)

(

if(str[i]>=,A,&&str[i]<=,Z')

str[i]+=32;

elseif(str[i]>=,a'&&str[i]<=,z')

str[i]-=32;

)

cout«str;

return0;

本题的c参考代码如下:

#include<stdio.h>

intmain()

(

inti;

charchflOO];

gets(ch);

i=0;

while(ch[i]!=,\O')

(

if(ch[i]<=,z'&&ch[i]>=,a')

ch[i]-=32;

elsech[iJ+=32;

i++;

)

puts(ch);

return0;

)

试题编号ALGO-81

算法训练动态数组使用

从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出。

要求尽可能使用函数实现程序代码。平均值为小数的只保留其整数部分。

样例输入

34002

样例输出

91

样例输入

7

3275291

样例输出

294

本题的C++参考代码如下:

#include<iostream>

usingnamespacestd;

intmain()

(

intn,a,sum=0;

cin»n;

for(inti=0;i<n;i++)

(

cin»a;

sum+=a;

)

cout«sum«nU«sum/n«endl;

return0;

本题的c参考代码如下:

#include<stdio.h>

intmain()

inti,n,a[100],b[100],sum=0,avg=0;

scanf(H%d'\&n);

for(i=0;i<n;i++)

(

scanf("%dn,&b[i]);

a[i]=b[i];

sum=sum+a[i];

)

avg=sum/n;

printf("%d%d\n”,sum,avg);

return0;

试题编号ALGO-79

算法训练删除数组零元素

从键盘读入n个整数放入数组中,编写函数Compactintegers,删除数组中所有值为0的元

素,其后元素向数组首端移动。注意,Compactintegers函数需要接受数组及其元素个数作

为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中元素的个数

并依次输出数组元素。样例输入:(输入格式说明:5为输入数据的个数,34002是

以空格隔开的5个整数)

5

34002

样例输出:(输出格式说明:3为非零数据的个数,342是以空格隔开的3个非零整数)

3

342

样例输入

7

0070090

样例输出

2

79

样例输入

3

000

样例输出

0

本题的C++参考代码如下:

#include"iostream”

usingnamespacestd;

intmain()

intn;

int*arr;

cin»n;

arr=newintfn];

intnum=0;

for(inti=0;i<n;++i)

(

cin»arr[i];

if(arr[i]!=0)

(

++num;

)

)

cout«num«endl;

for(inti=0;i<n;++i)

(

if(arr[i]==0)

(

continue;

)

cout«arr[i]«Mu;

)

return0;

)

本题的c参考代码如下:

#includeustdio.h"

intCompactlntegers(inta[],intlen)

(

inti,j,k;

for(k=0;k<len;k++)

for(i=0;i<len;i++)

(

if(a[i]==0)

(

for(j=i;j<len-l;j++)

a[j]=a[j+l];

len—;

returnlen;

voidprint(intaf],intlen)

(

inti;

for(i=0;i<len;i++)

printf(M%d",a[i]);

printf(n\nu);

)

intmain()

(

inta[100000];

intn;

scanf("%d”,&n);

inti;

for(i=0;i<n;i++)

scanf("%d”,&a[i]);

intlen=Compactlntegers(a,n);

if(len>l)

(

printf("%d\n",len);

print(a,len);

}

else

printf("%dn,0);

getchar();

getchar();

getchar();

return0;

试题编号ALGO-53

算法训练最小乘积(基本型)

问题描述

给两组数,各n个。

请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。

要求程序输出这个最小值。

例如两组数分别为:13-5和-241

那么对应乘积取和的最小值应为:

(-5)*4+3*(-2)+1*1=-25

输入格式

第一个行一个数T表示数据组数。后面每组数据,先读入一个n,接下来两行每行n个

数,每个数的绝对值小于等于1000。

n<=8,T<=1000

输出格式

一个数表示答案。

样例输入

2313-5-24151234510101

样例输出

-256

本题的C++参考代码如下:

#include<iostream>

#include<algorithm>

usingnamespacestd;

inta[8],b[8];

intmain()

(

intT,n;

inti,j;

cin»T;

while(T—)

(

intsum=O;

cin»n;

for(i=0;i<n;i++)

cin»a[i];

for(i=0;i<n;i++)

cin»b[i];

sort(a,a+n);

sort(b,b+n);

for(i=0;i<n;i++)

(

sum+=a[i]*b[n-l-i];

}

cout«sum«endl;

)

return0;

本题的c参考代码如下:

#include<stdio.h>

voidsort1(int*a,intn)

(

inti,j;

inttmp;

for(i=0;i<n-l;i++)

for(j=0;j<n-1-i;j++)

if(aU]>a[j+l])

(

tmp=a[j];

a[j]=a[j+l];

a[j+l]=tmp;

}

(

voidsort2(int*a,intn)

(

inti,j;

inttmp;

for(i=0;i<n-1;i++)

for(j=0;j<n-1-i;j++)

if(aU]<aU+l])

tmp=a[j];

a[j]=a[j+l];

a[j+l]=tmp;

)

)

intmain(void)

(

intT;

intn,i;

inttotal;

inta[8],b[8],c[8];

scanf(u%d'\&T);

while(T)

(

total=0;

scanf(u%dn,&n);

for(i=0;i<n;i++)

scanf("%dn,&a[i]);

for(i=0;i<n;i++)

scanf("%dH,&b[i]);

sortl(a,n);

sort2(b,n);

for(i=0;i<n;i++)

c[ij=alij*b[i];

for(i=0;i<n;i++)

total+=clij;

printf(n%d\n",total);

T-;

return0;

试题编号ALGO-51

算法训练Torry的困惑(基本型)

问题描述

Torry从小喜爱数学。一天,老师告诉他,像2、3、5、7……这样的数叫做质数。Torry

突然想到一个问题,前10,100,1000,10000……个质数的乘积是多少呢?他把这个问题

告诉老师。老师愣住了,一时回答不出来。于是Torry求助于会编程的你,请你算出前n个

质数的乘积。不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值。

输入格式

仅包含一个正整数储其中n<=l00000»

输出格式

输出一行,即前n个质数的乘积模50000的值。

样例输入

1

样例输出

2

本题的C++参考代码如下:

#include<iostream>

usingnamespacestd;

inta[100005];

intmain()

(

unsignedinti,j,n,ent=1,cj=2;

cin»n;

if(n==1)

(

cout«2«endl;

return0;

)

alOJ=2;

for(i=3;i<2000000;i++)

for(j=0;j<ent;j++)

if(aU]*a[j]>i)

(

break;

)

else

(

if(!(i%aUD)

(

break;

if(aU]*a[j]>i)

(

a[cnt++]=i;

cj=(cj%50000)*(i%50000);

if(ent==n)

(

break;

}

)

)

cout«cj%50000«endl;

return0;

)

本题的c参考代码如下:

#include<stdio.h>

intpr[100010];

inttop;

intisPrime(intn)

(

inti;

for(i=0;i<top;i++)

(

if(n%pr[i]==0)

(

return0;

return1;

intfindNextPrime(void)

intn=pr[top-1]+1;

while(!isPrime(n))

(

n++;

)

pr[top++]=n;

returnn;

)

intmain(void)

(

inti,n;

intresult=2;

scanf(u%d",&n);

pr[O]=2;

top=1;

for(i=1;i<n;i++)

{

intx=findNextPrime();

result*=x;

result%=50000;

prinlf("%d",result);

return0;

)

试题编号ALGO-49

算法训练寻找数组中最大值

问题描述

对于给定整数数组a[],寻找其中最大值,并返回下标。

输入格式

整数数组an,数组元素个数小于1等于100。输出数据分作两行:第一行只有一个数,

表示数组元素个数:第二行为数组的各个元素。

输出格式

输出最大值,及其下标

样例输入

3321

样例输出

30

本题的C++参考代码如下:

#include<iostream>

#include<algorithm>

#include<cstring>

usingnamespacestd;

inimain(){

intn,a[1000],max,ans;

cin»n;

for(inti=0;i<n;i++)

cin»a[i];

max=a[0];ans=0;

for(inti=l;i<n;i++){

if(a[i]>max){

max=a[i];

ans=i;

)

)

cout«max«M"«ans;

return0;

本题的c参考代码如下:

#include<stdio.h>

inimain()

(

intn,i,k,max;

scanf(n%dH,&n);

inta[n];

for(i=0;i<n;i++)

scanf(n%d",&a[i]);

max=a[O];

for(i=0;i<n;i++)

{

if(a[i]>=max)

(

max=a[i];

k=i;

)

)

printf(n%d%d'\max,k);

return0;

)

试题编号ALGO-48

算法训练关联矩阵

问题描述

有一个n个结点m条边的有向图,请输出他的关联矩阵。

输入格式

第一行两个整数n、m,表示图中结点和边的数目。n<=100,m<=1000o

接下来m行,每行两个整数a、b,表示图中有(a,b)边。

注意图中可能含有重边,但不会有自环。

输出格式

输出该图的关联矩阵,注意请勿改变边和结点的顺序。

样例输入

59

12

31

15

25

23

23

32

43

54

样例输出

1-11000000

-100111-100

0100-1-11-10

00000001-1

00-1-100001

本题的C++参考代码如下:

#include<iostream>

#include<cstdio>

usingnamespacestd;

intans[101][1001];

intmain()

intn,m;

inta,b;

cin»n»m;

for(inti=l;i<=m;i++)

(

scanf("%d%dH,&a,&b);

ans[a][i]=1;

ans[b][i]=-1;

)

for(inti=1;i<=n;i++)

(

for(intj=1;j<=m-l;j++)

(

printf(n%d",ans[i][j]);

}

printf(H%d\n",ans[i][m]);

}

return0;

)

本题的c参考代码如下:

#include<stdio.h>

intmain()

(

inti,ii,n,m,a[1000][2];

scanf(^'%d%d',,&n,&m);

for(i=0;i<m;i++)

scanf(u%d%d",&a[i][0],&a[i][l]);

for(i=1;i<=n;i++)

(

for(ii=0;ii<m;ii++)

(

if(i==a[ii][0])

(

printf("l");

}

else

if(i==a[ii][l])

printf("-l");

)

else

(

printf("O");

)

printfC^n1');

return0;

试题编号ALGO-42

算法训练送分啦

问题描述

这题想得分吗?想,请输出“yes”;不想,请输出“no”.

输出格式

输出包括一行,为“yes”或“no”。

本题的C++参考代码如下:

#include<cstdio>

#include<cstring>

usingnamespacestd;

intmain()

(

printf(Hyes\nM);

return0;

)

本题的c参考代码如下:

#include<stdio.h>

#include<stdio.h>

intmain()

(

printf("yes\n");

return0;

试题编号ALGO-8

算法训练操作格子

问题描述

有n个格子,从左到右放成一排,编号为1-n。

共有m次操作,有3种操作类型:

1.修改一个格子的权值,

2.求连续一段格子权值和,

3.求连续一段格子的最大值。

对于每个2、3操作输出你所求出的结果。

输入格式

第一行2个整数n,m。

接下来一行n个整数表示n个格子的初始权值。

接下来m行,每行3个整数p,x,y,p表示操作类型,p=l时表示修改格子x的权值为

y,p=2时表示求区间[x,y]内格子权值和,p=3时表示求区间[x,y]内格子最大的权值。

输出格式

有若干行,行数等于p=2或3的操作总数。

每行1个整数,对应了每个p=2或3操作的结果。

样例输入

43

1234

213

143

314

样例输出

6

3

数据规模与约定

对于20%的数据nv=100,m<=200。

对于50%的数据n<=5000,m<=5000o

对于100%的数据1<=n<=100000,m<=100000,0<=格子权值<=10000»

本题的C++参考代码如下:

//test

//l.cpp

/*

ID:Firwaless

LANG:C++

TASK:

*/

#include<cstdio>

#include<algorithm>

structTree

(

intsum,max;

);

Treetree[l«18];

voidscan(int&n)

(

chare;

c=getchar();

if(c==EOF){

return;

)

while(c<OIIc>9){

c=getchar();

)

n=c-O;

while(c=getchar(),c>='O'&&c<=*9'){

n*=10;

n+=c-'0*;

voidput(intn)

(

intent=0;

chars[16];

if(n==0){

putcharCO1);

return;

)

for(;n;n/=10){

s[cnt++]=n%10+*0';

)

while(ent—){

putchar(s[cnt]);

)

)

voidupdate(intn,intv)

(

for(n+=(1«17),tree[n].sum=tree[n].max=v,n»=1;n;n»=1){

tree[n].max=std::max(tree[n+n].max,tree[n+n+l].max);

tree[n].sum=tree[n+n].sum+tree[n+n+l].sum;

)

)

intquery(ints,intt,intfunc)

(

intsum=0,max=0;

for(s+=(1«17)-l,t+=(l«17)+l;sAtAl;s»=1,t»=1){

if(~s&1){

sum+=tree[sAIJ.sum;

max=std::max(max,tree[s八l].max);

)

if(t&1){

sum+=tree[tA1J.sum;

max=std::max(max,tree[tAl].max);

returnfunc?max:sum;

intmain()

intn,m,i,a,b,c;

scan(n);scan(m);

for(i=1;i<=n;++i){

scan(a);

update(i,a);

)

while(m—){

scan(c);scan(a);scan(b);

c==1&&(update(a,b),0);

c==2&&(put(query(a,b,0)),putchar(1\nr),0);

c==3&&(put(query(a,b,1)),putcharCXn1),0);

)

return0;

}

本题的c参考代码如下:

#include<stdio.h>

#defineN100000

#defineA1000

#defineB100

intsum(int*a,intm,intn)

(

inti,s=0;

for(i=m;i<=n;i++)

s+=a[i];

returns;

)

intmax(int*a,intm,intn)

(

inti,s=a[m];

for(i=m+1;i<=n;i++)

if(s<a[i])

s=a[i];

returns;

)

intmain()

inti,j,k,m,n;

inta[100000],b[100000][3],c[A][2]={0};

scanf("%d%d",&n,&m);

for(i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论