第一周算法训练
只写出来14道题,有一道思维题想来想去还错了哈哈哈
A.查成绩
题目链接:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-131
根据读入的find,insert,end来判断需要进行的操作
代码:
#include
#include
struct student
{
char name[20];
int score;
};
int main()
{
struct student stu[200];
char str[10];
char name0[20];
int i=0;
int j;
int a[200];
int k=0;
int q;
for(q=0;q<1000000;q++)
{
scanf("%s",str);
if(str[0]=='e')
break;
else if(str[0]=='i')
{
scanf("%s %d",stu[i].name,&stu[i].score);
i++;
}
else if(str[0]=='f')
{
int F=0;
scanf("%s",name0);
for(j=0;j<i;j++)
{
if(strcmp(name0,stu[j].name)==0)
{
a[k]=stu[j].score;
F=1;
break;
}
if(F==0) a[k]=-1;
}
k++;
}
}
for(i=0;i<k;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
D.回文数猜想
题目链接:
https://vjudge.net/problem/HDU-1282
写了一个函数来把数倒过来,很方便,题目不难,注意输出格式问题,用二维数组来储存变换的数字过程。
代码:
#include
#include
int reverse(int x)//将数倒过来
{
int a[100];
int i=0;
int j,y=0;
while(x)
{
a[i]=x%10;
x/=10;
i++;
}
for(j=0;j<i;j++)
{
y+=a[j]*pow(10,i-j-1);
}
return y;
}
int main()
{
int a,b;
int times[10000]={
0};//记录变换了几次
int count=0;//用来记录几个数
int group[100][1000];
int i,j;
while(scanf("%d",&group[count][times[count]])!=EOF)
{
a=group[count][times[count]];
while(a!=reverse(a))
{
times[count]++;//变换一次
group[count][times[count]]=a=a+reverse(a);
}
count++;
}
//printf("count=%d\n",count);
for(i=0;i<count;i++)
{
printf("%d\n",times[i]);
for(j=0;j<=times[i];j++)
{
printf("%d",group[i][j]);
if(j<times[i])
printf("--->");
else
printf("\n");
}
}
return 0;
}
F.买鸡问题
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1372
套娃就可啦,注意还有no answer
#include
int main()
{
int a,b,c;//公鸡母鸡小鸡数量
int i,j,k;//循环变量
int n;
int count=0;
scanf("%d",&n);
for(i=0;i<=n/5;i++)
{
for(j=0;j<=n/2;j++)
{
for(k=0;k<=3*n;k+=3)
{
if((5*i+3*j+k/3==n)&&(i+j+k==n))
{
printf("%d %d %d\n",i,j,k);
count=1;
}
}
}
}
if(count==0)
printf("No Answer.");
return 0;
}
H.最小新整数
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1258
要从前开始删去较大的数字,使这个数字尽量呈递增,这样的新整数才会最小。
代码:
#include
#include
int main()
{
int n;//n组数据
char s[20];//用来存一串数字
int k;//删去的位数
int len ,i,j;
scanf("%d\n",&n);
int p=0;
char result[100][20];
int l[100];
int q=n;
while(n--)
{
scanf("%s %d",s,&k);
len=strlen(s);
int b;
b=len;
int a;
//,从前面位数大的开始删,如果前面一位比后面一位的大,就删去 ,一共删去k位,即进行k次操作
for(i=0;i<k;i++)
{
for(j=0;j<len-1;j++)
{
if(s[j]>s[j+1])
{
for(a=j;a<len-1;a++)
{
s[a]=s[a+1];
}
len--;//删除一次,s少一位
break;//往前覆盖,再进行下一次删除
}
}
}
l[p]=b-k;
/*printf("l[%d]=%d\n",p,l[p]);
for(i=0;i
for(i=0;i<l[p];i++)
{
result[p][i]=s[i];
// printf("result[%d][%d]=%c\n",p,i,result[p][i]);
}
p++;
}
for(i=0;i<q;i++)
{
for(j=0;j<l[i];j++)
{
printf("%c",result[i][j]);
}
printf("\n");
}
return 0;
}
I赶时间
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1321
把时间都化成秒去计算就可以了
#include
int main()
{
char s1[20],s2[20];
int a1,a2;
scanf("%s %s",s1,s2);
a1=((s1[0]-'0')*10+(s1[1]-'0'))*3600+((s1[3]-'0')*10+(s1[4]-'0'))*60+(s1[6]-'0')*10+(s1[7]-'0');
a2=((s2[0]-'0')*10+(s2[1]-'0'))*3600+((s2[3]-'0')*10+(s2[4]-'0'))*60+(s2[6]-'0')*10+(s2[7]-'0');
printf("%d",a1-a2);
return 0;
}
J暖气坏了
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1703#include
每次只需判断前后重复的部分即可,减去重复部分再求和
int main()
{
char s1[20],s2[20];
int a1,a2;
scanf("%s %s",s1,s2);
a1=((s1[0]-'0')*10+(s1[1]-'0'))*3600+((s1[3]-'0')*10+(s1[4]-'0'))*60+(s1[6]-'0')*10+(s1[7]-'0');
a2=((s2[0]-'0')*10+(s2[1]-'0'))*3600+((s2[3]-'0')*10+(s2[4]-'0'))*60+(s2[6]-'0')*10+(s2[7]-'0');
printf("%d",a1-a2);
return 0;
}
L.n对数的排列问题
题目链接:
https://vjudge.net/problem/HDU-2554
找规律,当n是4的倍数或者3*n-1是4的倍数即可。
找规律过程:
代码:
#include
int main()
{
int n;
int i=0;
int l;
char s[1000000];
for(l=0;l<1000000;l++)
{
scanf("%d",&n);
if(n==0) break;
if((n%4==0)||((n*3-1)%4==0))
s[i]='Y';
else s[i]='N';
i++;
}
int j;
for(j=0;j<i;j++)
{
printf("%c\n",s[j]);
}
return 0;
}
M。母牛的故事
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1904
其实就是斐波那契问题,这一年的牛的数目等于前一年加上出生的,而三年前的以及以前的牛长到今年刚好能生小牛,即
F(n)=F(n-1)+F(n-3)
代码:
#include
int main()
{
int i;
int n;
scanf("%d",&n);
int a[60]={
0};
a[1]=1;
a[2]=2;
a[3]=3;
for(i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
}
printf("%d",a[n]);
return 0;
}
N.无限的路
题目链接:
https://vjudge.net/problem/HDU-2073
算出坐标距离原点的距离,再取差的绝对值即可
代码:
#include
#include
double sum(int x,int y)
{
int i;
int s;
double a[200];
double f=0,l=0;
s=x+y;
for(i=1;i<=s;i++)
{
a[i]=sqrt((i-1)*(i-1)+i*i);
f+=a[i];
}
for(i=1;i<s;i++)
{
l+=i;
}
f=f+sqrt(2)*(l+x);
return f;
}
int main()
{
int n;//n组数据
int x1,x2,y1,y2;//坐标
int i,j;
double result[100];
double sum1,sum2;
scanf("%d\n",&n);
for(i=0;i<n;i++)
{
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
sum1=sum(x1,y1);
sum2=sum(x2,y2);
result[i]=fabs(sum1-sum2);
//printf("sum1=%f sum2=%f\n",sum1,sum2);
}
for(i=0;i<n;i++)
{
printf("%.3f\n",result[i]);
}
return 0;
}
O.统计元音
题目链接:
https://vjudge.net/problem/HDU-2027
注意输出格式!!!
代码:
#include
#include
struct each
{
int num[5];
char s[200];
};
int main()
{
int n,i,j,len;
scanf("%d\n",&n);
struct each a[200];
int k=n;
for(i=0;i<n;i++)
{
gets(a[i].s);
len=strlen(a[i].s);
a[i].num[0]=0;
a[i].num[1]=0;
a[i].num[2]=0;
a[i].num[3]=0;
a[i].num[4]=0;
for(j=0;j<len;j++)
{
if(a[i].s[j]=='a')
a[i].num[0]++;
else if(a[i].s[j]=='e')
a[i].num[1]++;
else if(a[i].s[j]=='i')
a[i].num[2]++;
else if(a[i].s[j]=='o')
a[i].num[3]++;
else if(a[i].s[j]=='u')
a[i].num[4]++;
}
}
if(k>0)
{
for(i=0;i<k;i++)
{
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d",a[i].num[0],a[i].num[1],a[i].num[2],a[i].num[3],a[i].num[4]);
if(i<k-1)
printf("\n\n");
else printf("\n");
}
}
return 0;
}
P求数列的和
题目链接:
https://vjudge.net/problem/HDU-2009
代码:
#include
#include
int main()
{
double a[1000];
int b;
int i;
double sum[10000];
int k=0;
while((scanf("%lf %d",&a[0],&b))!=EOF)
{
sum[k]=a[0];
for(i=1;i<b;i++)
{
a[i]=sqrt(a[i-1]);
sum[k]+=a[i];
}
k++;
}
for(i=0;i<k;i++)
{
printf("%.2f\n",sum[i]);
}
return 0;
}
Q数字游戏
题目:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T3227
代码:
#include
int main()
{
char s[10];
gets(s);
int i;
int count=0;
for(i=0;i<8;i++)
{
if(s[i]=='1')
count ++;
}
printf("%d\n",count);
return 0;
}
Q轻重搭配
题目链接:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-A2240
代码:
#include
int a[500010];
int n;
//快排
void qsort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
qsort(left,i-1);
qsort(i+1,right);
return;
}
int main()
{
int i;
scanf("%d",&n);
int count=n;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//排个序
qsort(0,n-1);
int m;
m=n/2;
for(i=0;i<n/2;i++)
{
while(a[i]*2>a[m]&&m<n)
m++;
if(m>=n)
break;
//如果找到了
m++;//后移
count--;//少一张票;
}
printf("%d",count);
return 0;
}