1001 A+B Format(20)a+b,3个一组用“,”隔开
【题意】
计算A+B,并且3个一组用“,”隔开。
【解题思路】
自己的刚开始比较麻烦,先将计算后的sum存入一个数组中,先将sum的位数与3做模,不整除的位数先输出,再输出后面的数字,但要考虑最后三位的后面不用“,”。
后来看了大佬的题解,发现不用这么复杂,并学习了一个新的函数。但我这里用的是int数组就不用这个函数了。
sprintf(str,"%d",sum); //将num按指定格式输入到str字符串中。
【代码】
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
int a,b,sum,c[10]={0},d[10]={0},i=0,s;
cin>>a>>b;
sum=a+b;
if(sum==0){
cout<<"0"<<endl;
return 0;
}
if(sum<0){
cout<<"-";
sum=fabs(sum);
}
while(sum){
int x=sum%10;
c[i]=x;
sum=sum/10;
i++;
}
int x=i%3,j,y=x;
for(j=0;j<i;j++)d[j]=c[i-j-1];
j=0;
/*
while(x){ //注释这部分为自己刚开始写的
cout<<d[j];
x--;j++;
if(x==0 && i-j!=0)cout<<",";
}
int k=0;
for(;j<i;j++){
cout<<d[j];
k++;
if(k==3 && j!=i-1){
cout<<",";
k=0;
}
}
cout<<endl;*/
for(int j=0;j<i;j++){
cout<<d[j];
if((i-j-1)%3==0 && j!=i-1)cout<<",";
}
cout<<endl;
return 0;
}
1002 A+B for Polynomials(25)多项式相加
【题意】
两个多项式相加。给定每个多项式的系数和指数,求相加后的系数和指数。
【解题思路】
考虑到数据不是很大,直接定义一个数组a,因为多项式的系数一定为整数,所以将数组a的下标作为多项式的系数然后相加即可,输出数组数据不为0的数。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
int repeat=2,n,max=-1,min=5000;
double a[2000];
memset(a,0,sizeof(a));
while(repeat--){
cin>>n;
for(int i=0;i<n;i++){
int x;double y;
cin>>x>>y;
a[x]=a[x]+y;
if(x>max)max=x;
}
}
int k=0;
for(int i=0;i<=max+1;i++){
if(a[i]!=0)k++;
}
cout<<k;
for(int i=max;i>=0;i--){
if(a[i]!=0)printf(" %d %.1f",i,a[i]);
}
cout<<endl;
return 0;
}
1019 General Palindromic Number(20)回文数
【题意】
给定一个数n和b,判断n在b进制下是否是回文数,并输出n在b进制下的数。
【解题思路】
主要在于如何计算n在b进制下的数,其实还是简单滴,但是要注意a[]记录的数据是n在b进制下的数的逆序。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int a[maxn];
int main()
{
int n,b,k=0;
memset(a,0,sizeof(a));
scanf("%d%d",&n,&b);
while(n)
{
int x=n%b;
a[k++]=x;
n/=b;
}
int flag=1;
for(int i=0;i<k/2;i++)
{
if(a[i]!=a[k-i-1])
{
flag=0;
break;
}
}
if(flag)printf("Yes\n");
else printf("No\n");
printf("%d",a[k-1]);
for(int i=k-2;i>=0;i--)
printf(" %d",a[i]);
printf("\n");
return 0;
}
1017 Queueing at Bank (25)模拟
【题意】
模拟银行的作息,银行8:00-17:00营业,8:00之前到的顾客都需要等到8:00才能被服务,17:00以后到的顾客都不能被服务且不计入平均等待时间内,但是只要是17:00及以前到的不管他的服务时间是否超出17:00都能被服务。
【解题思路】
先排序,按来的时间的早晚进行排序,若相同则按服务时间排序,服务时间越短越靠前。然后只要找每个窗口最早的有空时间就好了,当窗口的时间大于顾客来的时间时要累加等待时间,否在则不累加。
另外为了方便都转换为秒来实现,最后输出/60就可以了。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
struct customer
{
int t,w;
}c[maxn];
bool cmp(customer a,customer b)
{
return a.t<b.t;
}
int main()
{
int n,k,hh,mm,ss,a[105],w;
int t1=8*3600,t2=17*3600,ans=0;
scanf("%d%d",&n,&k);
for(int i=0;i<k;i++)
a[i]=t1;
int num=n;
for(int i=0;i<n;i++)
{
scanf("%d:%d:%d",&hh,&mm,&ss);
scanf("%d",&w);
c[i].t=hh*3600+mm*60+ss;
c[i].w=w*60;
}
sort(c,c+n,cmp);
for(int i=0;i<n;i++)
{
int min1=a[0],p=0;
if(c[i].t>t2)
{
num--;
continue;
}
for(int j=1;j<k;j++)
{
if(min1>a[j])
{
min1=a[j];
p=j;
}
}
if(min1>=c[i].t)
{
ans+=min1-c[i].t;
a[p]+=c[i].w;
}
else
a[p]=c[i].t+c[i].w;
//printf("ans=%d,a[%d]=%d\n",ans,p,a[p]);
}
double avg=ans*1.0/(60*num*1.0);
printf("%.1f\n",avg);
return 0;
}
1023 Have Fun with Numbers(20)大数相加
【题意】
某个数乘以两倍之后看每位数的个数是否与原数相同。比如123456789,num[1]~num[9]均等于1,乘2倍后246913578,num[1]~num[9]也均等于1。
【解题思路】
这题有3个注意点
1.因为n的位数最大为20位,而long long只有19位,并且考虑到乘2倍之后要进位的关系,所以需要用字符串处理。
2.如果进位后,每位数与原来的个数肯定不同,这个要单独拿出来考虑,不然可能存在某个数,乘以2倍后数字中会有0,但其他各位数的个数都与原数相同的情况。
3.注意最后输出的时候不管Yes还是No都要把乘以两倍后的数输出。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=25;
char a[maxn],b[maxn],c[maxn];
int num1[10],num2[10];
int main()
{
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(c,0,sizeof(c));
scanf("%s",a);
int l=strlen(a);
for(int i=0;i<l;i++)
num1[a[i]-'0']++;
for(int i=0;i<l;i++)
b[i]=a[l-i-1];
int t=0,i;
for(i=0;i<l;i++)
{
int x=b[i]-'0'+b[i]-'0'+t;
t=x/10;
c[i]=x%10+'0';
}
int l2=i,flag=1;
if(t!=0)
{
c[l2++]=t+'0';
flag=0;
}
if(flag)
{
for(i=0;i<l2;i++)
num2[c[i]-'0']++;
for(i=1;i<=9;i++)
{
if(num1[i]!=num2[i])
{
flag=0;
break;
}
}
}
if(!flag)printf("No\n");
else printf("Yes\n");
for(i=l2-1;i>=0;i--)
printf("%c",c[i]);
printf("\n");
return 0;
}
1024 Palindromic Number(25)大数相加
【题意】
给定n和step,判断n是否为回文数,若不是,则将n反转后再加n,看其是不是回文数,若是则输出步数,若不是继续上述操作,当操作步数大于step时输出step。
【解题思路】
数据很大还是需要大数相加,再注意一些细节即可。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=55;
char a[maxn],b[maxn],c[maxn],lc;
int judge()
{
int l=strlen(a),flag=1;
for(int i=0;i<l/2;i++)
{
if(a[i]!=a[l-i-1])
return 0;
}
if(flag)return 1;
}
void add()
{
int l=strlen(a),t=0,i;
for(i=0;i<l;i++)
{
int x=a[i]-'0'+b[i]-'0'+t;
c[i]=x%10+'0';
t=x/10;
}
lc=i;
if(t!=0)c[lc++]=t+'0';
}
int main()
{
int m,flag=1,i;
scanf("%s%d",a,&m);
for(i=0;i<m;i++)
{
lc=0;
memset(c,0,sizeof(c));
if(judge())break;
int l=strlen(a);
for(int j=0;j<l;j++)
b[j]=a[l-j-1];
add();
for(int j=lc-1,k=0;j>=0;j--,k++)
a[k]=c[j];
}
printf("%s\n%d\n",a,i);
return 0;
}
1025 PAT Ranking(排序)
【题意】
分成K组,每组N个人,输出每个人在每组的排名,以及其的组别。最后再按字典序顺序输出整体的排名。
【解题思路】
每组数据排个序记录局部排名,再整体排序记录整体排名,注意最后输出时当分数相同时,序号越小越靠前。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
struct regist
{
string sno;
int score;
int fr,ln,lr;
}r[maxn];
bool cmp(regist a,regist b)
{
return (a.score==b.score)?a.sno<b.sno:a.score>b.score;
}
int main()
{
int n,k,t=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&k);
for(int j=t;j<t+k;j++)
{
cin>>r[j].sno>>r[j].score;
r[j].ln=i;
}
sort(r+t,r+t+k,cmp);
int p=1,q=1;
r[t].lr=p;
for(int j=t+1;j<t+k;j++)
{
if(r[j-1].score==r[j].score)
{
r[j].lr=p;
q++;
}
else
{
p+=q;
r[j].lr=p;
q=1;
}
}
t+=k;
}
sort(r,r+t,cmp);
int p=1,q=1;
r[0].fr=p;
for(int i=1;i<t;i++)
{
if(r[i-1].score==r[i].score)
{
r[i].fr=p;
q++;
}
else
{
p+=q;
r[i].fr=p;
q=1;
}
}
printf("%d\n",t);
for(int i=0;i<t;i++)
{
cout<<r[i].sno;
printf(" %d %d %d\n",r[i].fr,r[i].ln,r[i].lr);
}
return 0;
}