近日做题题解总结
P1540机器翻译题解
因为没有理解题目,在做题过程中遇到了许多困难。本人感觉要注意一下几点:
1.当a数组中还未存入b数组的元素若已在b数组中出现,就不应再存入b数组中。2.要先判断再进行b数组的储存。3.将b数组中的元素往前移一位时应当记得给最后一个元素赋值。
#include<stdio.h>
int main()
{
int N,M,a[1005],b[1000],j,flag=1,t,i,z=1;
scanf("%d%d",&M,&N);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
b[0]=a[0];
for(i=1;i<N;i++)
{
if(z<M){
for(t=0;t<z;t++)
{
if(a[i]==b[t])break;
}
if(t==z){
flag++;
b[z]=a[i];
z++;
}
}//数组b未存满的情况
else{
for(t=0;t<M;t++)
{
if(a[i]==b[t])break;
}
if(t==M){
flag++;
for(j=1;j<M;j++)
{
b[j-1]=b[j];
}
b[j-1]=a[i];
}
}
} //数组b已存满的情况
printf("%d",flag);
return 0;
}
P1098字符串的展开题解
会有几种比较坑人的情况:
1.开头或者末尾出现'-'。2.出现连续的连字符。3.连字符两端可能不一致,比如数字和字母,大写字母和小写字母。(出现这种情况连字符就保留原样,不用再改变什么了。)
由于我太菜了,没有很好地掌握三目运算符,写的代码分的情况较多也比较长。
#include<stdio.h>
#include<string.h>
int main()
{
char s[10000],y;
int p1,p2,p3,x,r,t,j,i,n;
scanf("%d%d%d",&p1,&p2,&p3);
scanf("%s",s);
for(i=0;s[i]!='\0';i++)
{
if(s[i]=='-'&&i!=0&&s[i+1]!='\0'){
if(s[i+1]-s[i-1]==1){
x=strlen(s);
for(j=i;j<x;j++)
{
s[j]=s[j+1];
}
s[x-1]='\0';
}
else if(s[i+1]-s[i-1]>1){
t=s[i+1]-s[i-1]-1;
x=strlen(s);
n=x;
if(s[i-1]>=65&&s[i-1]<=90&&s[i+1]>=65&&s[i+1]<=90){
for(j=x+p2*t-2,r=0;r<x-i;r++)
{
s[j]=s[n-1];
n--;
j--;
}
s[x+p2*t-1]='\0';
if(p1==1){
if(p3==1){
for(n=p2,r=0,j=i,y=s[i-1];r<t*p2;r++)
{
s[j]=y+1+32;
j++;
n--;
if(n==0){
y++;
n=p2;
}
} }
else{
for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1+32;
j--;
n--;
if(n==0){
y++;
n=p2;
}
}
}
}
else if(p1==2){
if(p3==1){
for(n=p2,r=0,j=i,y=s[i-1];r<=t;r++)
{
s[j]=y+1;
j++;
n--;
if(n==0){
y++;
n=p2;
}
} }
else{
for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1;
j--;
n--;
if(n==0){
y++;
n=p2;
}
}
}
}
else{
for(j=i;j<i+p2*t;j++)
{
s[j]='*';
}
}
}//两端都是大写字母的情况
else if(s[i-1]>=97&&s[i-1]<=122&&s[i+1]>=97&&s[i+1]<=122){
for(j=x+p2*t-2,r=0;r<x-i;r++)
{
s[j]=s[n-1];
n--;
j--;
}
s[x+p2*t-1]='\0';
if(p1==1){
if(p3==1){
for(n=p2,r=0,j=i,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1;
j++;
n--;
if(n==0){
y++;
n=p2;
}
} }
else{
for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1;
j--;
n--;
if(n==0){
y++;
n=p2;
}
}
}
}
else if(p1==2){
if(p3==1){
for(n=p2,r=0,j=i,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1-32;
j++;
n--;
if(n==0){
y++;
n=p2;
}
} }
else{
for(n=p2,r=0,j=i-1+p2*t,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1-32;
j--;
n--;
if(n==0){
y++;
n=p2;
}
}
}
}
else{
for(j=i;j<i+p2*t;j++)
{
s[j]='*';
}
}
}//两端都是小写字母的情况
else if(s[i-1]>=48&&s[i-1]<=57&&s[i+1]>=48&&s[i+1]<=57){
for(j=x+p2*t-2,r=0;r<x-i;r++)
{
s[j]=s[n-1];
n--;
j--;
}
s[x+p2*t-1]='\0';
if(p1==3){
for(j=i;j<i+p2*t;j++)
{
s[j]='*';
}
}
else{
if(p3==1){
for(n=p2,r=0,j=i,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1;
j++;
n--;
if(n==0){
y++;
n=p2;
}
}
}
else{
for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
{
s[j]=y+1;
j--;
n--;
if(n==0){
y++;
n=p2;
}
}
}
}//两端都是数字的情况
}
}
}
}
printf("%s",s) ;
return 0;
}
P1478陶陶摘苹果(升级版)题解
这道题到不是很难,主要是一个小点(数组c开得太小啦,多加一个0一下就AC了......有点无语......)一直没发现,让我一直AC不了,对这道题花了很多时间,因此想要纪念一下。梳理一下我的思路吧:
1.将陶陶可以摘到的苹果的力气值存入数组c。2.将这些存入数组c的力气值从小到大快排。3.将这些力气值累加,当累加的力气值大于陶陶所拥有的力气值时,则陶陶没力气摘苹果了。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int cmp(const void *x, const void *y);
int n,s,a,b,i,j,z=0,c[10000],r;
scanf("%d%d",&n,&s);
scanf("%d%d",&a,&b);
for(r=0;r<n;r++)
{
scanf("%d%d",&i,&j);
if(a+b>=i){
c[z]=j;
z++;
}//将可摘苹果存入一个新数组
}
if(z==0){
printf("0\n");
return 0;
}
qsort(c,z,sizeof(int),cmp);
int t=c[0],flag=0;
for(i=1;i<z;i++)
{
if(t>s)break;
t+=c[i];
flag++;
}//在力气值的基础上再判断可摘苹果的个数
printf("%d\n",flag);
return 0;
}
int cmp(const void *x, const void *y)
{
return *(int*)x-*(int*)y;
}
以上就是这几天困扰我的几题题目的题解,由于本人太菜,一题就要做好久,所以题量也不是很多。