7-3 N个数求和 (20分)
思路:从第二个数开始,每输入一个就进行一次加法运算,求分母的最小公倍数,最后特殊判断输出即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct
{
long long fenzi,fenmu;
}Num;
Num num[101];
ll gcd(ll a ,ll b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n;
ll m=1,z=0,fz,fm;
cin>>n;
scanf("%lld/%lld",&z,&m);
int tmp=gcd(z,m);
if(z){
z/=tmp;m/=tmp;
}
for(int i=2;i<=n;i++)
{
scanf("%lld/%lld",&fz,&fm);
int lcp=m/gcd(m,fm)*fm;
z=z*lcp/m+fz*lcp/fm;
m=lcp;
int t=gcd(z,m);
if(t)
{
z=z/t; m=m/t;
}
}
if(z&&z/m==0)
cout<<z%m<<"/"<<m;
else if(z%m==0) cout<<z/m;
else cout<<z/m<<" "<<z%m<<"/"<<m;
return 0;
}
7-9 名人堂与代金券 (25分)
思路:结构体排序,相同成绩的注意名次标记。
#include<bits/stdc++.h>
using namespace std;
struct Student
{
string s;
int score;
}str[10010];
bool cmp(Student a,Student b)
{
if(a.score==b.score)return a.s<b.s;
else return a.score>b.score;
}
int main()
{
int n,g,k,i,j;
// string s[10010];
int ct=0;
cin>>n>>g>>k;
for(i=0;i<n;i++)
{
cin>>str[i].s;
getchar();
cin>>str[i].score;
if(str[i].score>=g&&str[i].score<=100)ct+=50;
else if(str[i].score>=60&&str[i].score<g)ct+=20;
}
int m=0;
sort(str,str+n,cmp);
cout<<ct<<endl;
int r=0,q=0;
for(i=0;i<n;i++)
{
if(q!=str[i].score&&i>=k)break;
if(q!=str[i].score)
{
r=i+1;
}
cout<<r<<" "<<str[i].s<<" "<<str[i].score<<endl;
q=str[i].score;
}
}
7-12 月饼 (25分)
思路:按照单价进行结构体排序,从单价大的开始卖(简单模拟)。
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
double total_price,amount,per_price;
}mooncake;
mooncake p[1001];
bool cmp(mooncake a,mooncake b)
{
return a.per_price>b.per_price;
}
int main()
{
int n;
double d;
cin>>n>>d;
int i;
for(i = 0;i < n;i++)
{
cin>>p[i].amount;
}
for(i = 0 ;i < n;i++)
{
cin>>p[i].total_price;
}
for(i = 0;i < n;i++)
{
p[i].per_price = p[i].total_price/p[i].amount;
}
sort(p,p+n,cmp);
double sum = 0;
for(i = 0;i < n&&d>0;i++)
{
if(d>p[i].amount)
{
d = d-p[i].amount;
sum = sum+p[i].total_price;
}
else if(d<=p[i].amount)
{
sum = sum+d*p[i].per_price;
d = 0;
}
}
printf("%.2lf\n",sum);
}