1031 Hello World for U(20)字符串处理
【题意】
将一个字符串用U字形显示,若n为字符串的长度。
【解题思路】
行:(n+2)/3,列:n+2-2*行
开一个二维数组存储字符比较方便。
【代码】
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[100];
char a[40][40];
scanf("%s",s);
int i,j;
int n1,n2;
int len=strlen(s);
n1=(len+2)/3;
n2=(len+2-n1-n1);
for(i=1;i<=n1;i++)
{
for(j=1;j<=n2;j++)
a[i][j]=' ';
}
int q=0;
for(i=1;i<=n1;i++)
a[i][1]=s[q++];
for(i=2;i<=n2;i++)
a[n1][i]=s[q++];
for(i=n1-1;i>=1;i--)
a[i][n2]=s[q++];
for(i=1;i<=n1;i++)
{
for(j=1;j<=n2;j++)
printf("%c",a[i][j]);
printf("\n");
}
return 0;
}
1032 Sharing(25)链表
【题意】
给两个单词的初始字母的节点地址,再给n个节点,每个节点由地址,字符,和指向下一个字符的地址构成,输出两个单词相同的字母的那个节点的地址。
【解题思路】
这里不用链表做,链表真是代码太长了,直接用结构存储就可以了,为了方便再定义一个vis数组,将第一个单词出现过的字母的地址都记为1,等到遍历第二个单词的时候,一旦vis数组=1,即说明这个字母和上一个单词重复了。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int vis[maxn];
struct letter
{
int st,en;
char a;
}l[maxn];
int main()
{
int a,b,a2,b2,n,x,t,flag=0;
char c;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&a,&b,&n);
for(int i=0;i<n;i++)
{
scanf("%d %c %d",&a2,&c,&b2);
l[a2].st=a2;
l[a2].en=b2;
l[a2].a=c;
}
x=a;
while(x!=-1)
{
vis[x]=1;
x=l[x].en;
}
x=b;
while(x!=-1)
{
if(vis[x])
{
t=x;
flag=1;
break;
}
x=l[x].en;
}
if(flag)printf("%05d\n",t);
else printf("-1\n");
return 0;
}
1035 Password(20)模拟
【题意】
给n个用户名和密码,把密码中的1改为@,0改为%,l改为L,O改为o。让你输出需要修改密码的用户名个数,以及对应的用户名和密码,按输入的顺序。如果没有用户需要修改,则输出对应的语句,注意单复数。
【解题思路】
水题没啥好说的,注意单复数!!不然一直会有1个测试点过不了。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
struct user
{
char a[25],b[25];
int f=0;
}u[maxn];
int main()
{
int n,num=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s %s",&u[i].a,&u[i].b);
int l=strlen(u[i].b);
int flag=0;
for(int j=0;j<l;j++)
{
if(u[i].b[j]=='1')
{
u[i].b[j]='@';
flag++;
}
else if(u[i].b[j]=='0')
{
u[i].b[j]='%';
flag++;
}
else if(u[i].b[j]=='O')
{
u[i].b[j]='o';
flag++;
}
else if(u[i].b[j]=='l')
{
u[i].b[j]='L';
flag++;
}
}
if(flag!=0)
{
num++;
u[i].f=1;
}
}
if(!num && n>1)printf("There are %d accounts and no account is modified\n",n);
else if(!num && n==1)printf("There is %d account and no account is modified\n",n);
else
{
printf("%d\n",num);
for(int i=0;i<n;i++)
{
if(u[i].f)
printf("%s %s\n",u[i].a,u[i].b);
}
}
return 0;
}
1036 Boys vs Girls(25)排序
【题意】
给n个学生,输出男生中成绩最低的人的名字和学号,输出女生中成绩最高的人的名字和学号,并输出成绩的差值。若没有男生或没有女生,在那一栏输出“Absent”,成绩的差值输出"NA"。
【解题思路】
排序即可,注意细节。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
struct people
{
char name[15];
char sno[15];
int score;
}a[maxn],b[maxn];
bool cmp(people a,people b)
{
return a.score<b.score;
}
int main()
{
char c;
int n,k1=0,k2=0;
scanf("%d",&n);
while(n--)
{
char s[15];
scanf("%s %c",s,&c);
if(c=='M')
{
strcpy(a[k1].name,s);
scanf("%s %d",a[k1].sno,&a[k1].score);
//printf("%s %s %d\n",a[k1].name,a[k1].sno,a[k1].score);
k1++;
}
else
{
strcpy(b[k2].name,s);
scanf("%s %d",b[k2].sno,&b[k2].score);
k2++;
}
}
sort(a,a+k1,cmp);
sort(b,b+k2,cmp);
if(k2==0)
{
printf("Absent\n");
printf("%s %s\n",a[0].name,a[0].sno);
printf("NA\n");
}
else if(k1==0)
{
printf("%s %s\n",b[k2-1].name,b[k2-1].sno);
printf("Absent\n");
printf("NA\n");
}
else
{
printf("%s %s\n",b[k2-1].name,b[k2-1].sno);
printf("%s %s\n",a[0].name,a[0].sno);
printf("%d\n",b[k2-1].score-a[0].score);
}
return 0;
}
1037 Magic Coupon(25)排序
【题意】
题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积。
【解题思路】
将两个序列的正和负数分开,排个序,负数从小到大排,正数从大到小排,然后分别相乘就可以了。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn],c[maxn],d[maxn];
bool cmp(int a ,int b)
{
return a>b;
}
int main()
{
int n,k1=0,k2=0,j1=0,j2=0,ans=0;
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
if(x>=0)a[k1++]=x;
else b[k2++]=x;
}
scanf("%d",&n);
while(n--)
{
int x;
scanf("%d",&x);
if(x>=0)c[j1++]=x;
else d[j2++]=x;
}
sort(a,a+k1,cmp);sort(c,c+j1,cmp);
sort(b,b+k2);sort(d,d+j2);
for(int i=0;i<k1 && i<j1;i++)
ans+=a[i]*c[i];
for(int i=0;i<k2 && i<j2;i++)
ans+=b[i]*d[i];
printf("%d\n",ans);
return 0;
}