文章推荐
蓝桥杯练习系统习题-算法提高2
题目搜索方式:Ctrl+F—-> 输入题目名称—>定位到解答.
入门训练 基础练习 基础练习 算法训练 算法训练 算法训练 算法训练 算法训练 算法训练 算法提高 算法提高 历届试题 历届试题
基础练习
算法训练
算法训练
算法训练
算法提高
历届试题
Torry的困惑(提高型)
#include<stdio.h>
#include<math.h>
int is_prime(int x) {
int i,s = sqrt(x);
for(i = 2; i <= s; i++) {
if(x % i == 0) {
return 0;
}
}
return 1;
}
int main()
{
//("%d",is_prime(2));
int n,count=0,i=1;
long long result=1;
scanf("%d",&n);
while(count<n)
{
i++;
if(is_prime(i))
{
result=(result%50000)*(i%50000)%50000;
count++;
}
}
printf("%I64d\n",result);
return 0;
}
计算时间
#include <stdio.h>
#include <stdlib.h>
int b[100000][3];
int main(int argc, char *argv[]) {
int i,n=0,a;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a);
b[i][0]=a%60;a/=60;
b[i][1]=a%60;
b[i][2]=a/=60;
}
for(i=0;i<n;i++)
{
printf("%02d:%02d:%02d\n",b[i][2],b[i][1],b[i][0]);
}
return 0;
}
最小乘积(提高型)
#include "stdio.h"
#define Size 1002
int part1(int a[],int left,int right)
{
int x;
int low;
int high;
x=a[left];
low=left;
high=right;
while(low<high)
{
while(a[high]>x&&low<high)
{
high--;
}
if(low<high)
{
a[low]=a[high];
low++;
}
while(a[low]<x&&low<high)
{
low++;
}
if(low<high)
{
a[high]=a[low];
high--;
}
}
a[low]=x;
return low;
}
int part2(int a[],int left,int right)
{
int x;
int low;
int high;
x=a[left];
low=left;
high=right;
while(low<high)
{
while(a[high]<x&&low<high)
{
high--;
}
if(low<high)
{
a[low]=a[high];
low++;
}
while(a[low]>x&&low<high)
{
low++;
}
if(low<high)
{
a[high]=a[low];
high--;
}
}
a[low]=x;
return low;
}
void sort2(int a[],int low,int high)
{
int mid;
if(low<high)
{
mid=part2(a,low,high);
sort2(a,low,mid-1);
sort2(a,mid+1,high);
}
}
void sort1(int a[],int low,int high)
{
int mid;
if(low<high)
{
mid=part1(a,low,high);
sort1(a,low,mid-1);
sort1(a,mid+1,high);
}
}
int main()
{
int T;
int n;
int i;
int a[Size];
int b[Size];
int l;
int sum;
scanf("%d",&T);
while(T)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
sort1(a,1,n);
sort2(b,1,n);
sum=0;
for(l=1;l<=n;l++)
{
sum=sum+(a[l]*b[l]);
}
printf("%d",sum);
printf("\n");
T--;
}
return 0;
}
卡勒沃夫之弱水路三千(提高型)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char mm[105][15];
char s1[15],s2[15];
int link[105][2];
int length[105]={<!-- -->0};
int in[105];
int N;
typedef struct{<!-- -->
char name[15];
int num;
}girl;
void fun(int x)
{
int i,y;
for(i=0;i<N;i++)
if(link[i][0]==x)
{
y=link[i][1];
length[ y ]=length[x]+1>=length[y]?length[x]+1:length[y];
fun(y);
}
}
int comp(const void *a, const void *b)
{
return (*(girl *)a).num>(*(girl *)b).num?1:-1;
}
int main()
{
int i,j,T,n,f,x,y,sum=0;
girl g[105];
scanf("%d",&T);
while(T--)
{
memset(mm,0,sizeof(mm));
memset(link,0,sizeof(mm));
memset(in,0,sizeof(in));
memset(length,0,sizeof(length));
scanf("%d",&N);
n=0;
for(i=0;i<N;i++)
{
scanf("%s%s",s1,s2);
f=0;
for(j=0;j<n;j++)
if(strcmp(s1,mm[j])==0)
{
f=1;
break;
}
if(f==1)
x=j;
else
{
strcpy(mm[n++],s1);
x=n-1;
}
f=0;
for(j=0;j<n;j++)
if(strcmp(s2,mm[j])==0)
{
f=1;
break;
}
if(f==1)
y=j;
else
{
strcpy(mm[n++],s2);
y=n-1;
}
link[i][0]=x;
link[i][1]=y;
}
for(i=0;i<N;i++)
in[link[i][1]]++;
for(i=0;i<n;i++)
if(in[i]==0)
break;
fun(i);
for(i=0;i<n;i++)
{
strcpy(g[i].name,mm[i]);
g[i].num=length[i];
}
qsort(g,n,sizeof(g[0]),comp);
for(i=0;i<n;i++)
{
printf("%s",g[i].name);
if(i==n-1)
printf("\n");
else
printf(" ");
}
}
return 0;
}
最大乘积
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int max;
void fun(int *val,int index,int size,int m,int cnt,int res);
int main()
{
int n,m,x,i;
int val[15];
scanf("%d",&x);
while(x--)
{
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&val[i]);
}
max = -10000000;
fun(val,0,n,m,0,1);
printf("%d\n",max);
}
return 0;
}
void fun(int *val,int index,int size,int m,int cnt,int res)
{
if(m==cnt)
{
if(res > max)
{
max = res;
}
return ;
}
if(index>=size)
{
return ;
}
fun(val,index+1,size,m,cnt+1,res*val[index]);
fun(val,index+1,size,m,cnt,res);
}
和最大子序列
#include<stdio.h>
int a[100001];
int main()
{
int n,i1;
scanf("%d",&n);
for(i1=0;i1<n;i1++)
scanf("%d",&a[i1]);
int sum=-100098087;
for(i1=1;i1<n;i1++)
{<!-- -->if(a[i1-1]>0)
a[i1]=a[i1-1]+a[i1];
}
for(i1=0;i1<n;i1++)
if(a[i1]>sum)
sum=a[i1];
printf("%d\n",sum);
return 0;
}
统计单词数
#include<stdio.h>
#include<string.h>
struct ha
{<!-- --> int n;
char c[21];
}hasi[1000];
int main()
{ int i1,i2;
char a[1500],b[21];
gets(a);
int o=0,p=0;
for(i1=0;a[i1];i1++)
{ if(a[i1]<='z'&&a[i1]>='a')
a[i1]-='a'-'A';
}
for(i1=0;a[i1+1];i1++)
{
if(a[i1]<'A'||a[i1]>'z'||a[i1]<'a'&&a[i1]>'Z')
{ b[o]='\0';
if(o==0)
continue;
for(i2=0;i2<p;i2++)
{
if(!strcmp(hasi[i2].c,b))
{ hasi[i2].n++;
break;
}
}
if(i2==p)
{
strcpy(hasi[p].c,b);
hasi[p].n=1;
p++;
}
o=0;
continue;
}
b[o++]=a[i1];
}
b[o]='\0';
for(i2=0;i2<p;i2++)
{
if(!strcmp(hasi[i2].c,b))
{ hasi[i2].n++;
break;
}
}
if(i2==p)
{
strcpy(hasi[p].c,b);
hasi[p].n=1;
p++;
}
for(i1=0;i1<p;i1++)
{
for(i2=0;hasi[i1].c[i2];i2++)
if(hasi[i1].c[i2]<='Z'&&hasi[i1].c[i2]>='A')
printf("%c",hasi[i1].c[i2]);
else
printf("%c",hasi[i1].c[i2]-'a'+'A');
printf(":");
for(i2=0;i2<hasi[i1].n;i2++)
printf("*");
printf("%d",hasi[i1].n);
printf("\n");
}
return 0;
}
实数相加
#include<stdio.h>
int a[101],b[101],c[101],d[101],e[101],f[101];
int main()
{ char k[1000],l[1001];
int i1,i2,a1,b1,c1,d1,e1,f1;
gets(k);
gets(l);
int o=0;
for(i1=0;k[i1];i1++)
{
if(k[i1]=='.')
{i1++;
break;}
a[o++]=k[i1]-'0';
}
a1=o;
o=0;
for(;k[i1];i1++)
{
b[o++]=k[i1]-'0';
}
b1=o;
o=0;
for(i1=0;l[i1];i1++)
{
if(l[i1]=='.')
{i1++;
break;}
c[o++]=l[i1]-'0';
}
c1=o;
o=0;
for(;l[i1];i1++)
{
d[o++]=l[i1]-'0';
}
d1=o;
o=0;
int jiwei=0;
for(i1=b1-1,i2=d1-1;i1>=0||i2>=0;)
{
if(i1==i2)
{
f[o]=(b[i1]+d[i2]+jiwei)%10;
jiwei=(b[i1]+d[i2]+jiwei)/10;
o++;i1--;i2--;
}
else if(i1>i2)
{ f[o]=(b[i1]+jiwei)%10;
jiwei=(b[i1]+jiwei)/10;
o++;i1--;
}
else
{
f[o]=(d[i2]+jiwei)%10;
jiwei=(d[i2]+jiwei)/10;
o++;i2--;
}
}
f1=o;
o=0;
for(i1=a1-1,i2=c1-1;i1>=0||i2>=0;i1--,i2--)
{
if(i1<0)
{ e[o]=(c[i2]+jiwei)%10;
jiwei=(c[i2]+jiwei)/10;
o++;
}
else if(i2<0)
{e[o]=(a[i1]+jiwei)%10;
jiwei=(a[i1]+jiwei)/10;
o++;
}
else
{e[o]=(a[i1]+c[i2]+jiwei)%10;
jiwei=(a[i1]+c[i2]+jiwei)/10;
o++;
}
}
if(jiwei==1)
e[o++]=1;
for(i1=o-1;i1>=0;i1--)
printf("%d",e[i1]);
if(b1==0&&d1==0)
return 0;
printf(".");
for(i1=f1-1;i1>=0;i1--)
printf("%d",f[i1]);
return 0;
}
项链
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i1,i2;
gets(a);
int max=0,n=strlen(a);
int total=0;
for(i1=0;a[i1];i1++)
{
char p='w';
total=0;
for(i2=i1;;i2++)
{ if(i2>=n)
i2-=n;
if(p=='w'||a[i2]==p||a[i2]=='w')
{
if(a[i2]!='w')
p=a[i2];
total++;
}
else
break;
if(total>=n)
break;
}
p='w';
for(i2=i1-1;;i2--)
{ if(total>=n)
break;
if(i2<0)
i2+=n;
if(p=='w'||a[i2]==p||a[i2]=='w')
{ if(a[i2]!='w')
p=a[i2];
total++;
}
else
break;
}
if(total>max)
max=total;
}
printf("%d\n",max);
return 0;
}
交换Easy
#include <stdio.h>
int main()
{
int n,m,ary[1000],temp,op1,op2;
scanf("%d %d",&n,&m);
int i;
for(i=0;i<n;i++)
{
scanf(" %d",&ary[i]);
}
for(i=0;i<m;i++)
{
scanf(" %d %d",&op1,&op2);
if(op1 != op2)
{
temp=ary[op1-1];
ary[op1-1]=ary[op2-1];
ary[op2-1]=temp;
}
}
for(i=0;i<n;i++)
{
printf("%d\n",ary[i]);
}
}