第一章的第三部分个人感觉稍微涉及到一些简单的排序算法了
FatMouse’ Trade
(本题的关键在于排序,用一个冒泡即可)
#include <stdio.h>
int main(){
int M,N;
double J[1000],F[1000],sum;
while(scanf("%d%d",&M,&N) && (M!=-1 || N!=-1)){
for(int i=0;i<N;i++){
scanf("%lf%lf",&J[i],&F[i]);
}
for(int i=0;i<N-1;i++){
for(int j=0;j<N-1-i;j++){
if(J[j]/F[j] < J[j+1]/F[j+1]){
double temp = J[j];
J[j] = J[j+1];
J[j+1] = temp;
temp = F[j];
F[j] = F[j+1];
F[j+1] = temp;
}
}
}
sum=0;
for(int i=0;i<N;i++){
if(M>=F[i]){
M-=F[i];
sum+=J[i];
}else{
sum+=J[i]/F[i]*M;
M=0;
}
if(M==0){
break;
}
}
printf("%.3lf\n",sum);
}
return 0;
}
Tian Ji – The Horse Racing
(这题稍微有点烧脑,关键在于区分田忌和国王赛马之间的具体比较顺序)
#include <stdio.h>
int main(){
int n,temp,i,j,times,wins,x,y;
int a[1000],b[1000];
while(scanf("%d",&n) && (n!=0)){
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){
scanf("%d",&b[i]);
}
//两次冒泡将国王和田忌的马均按速度从大到小排序
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(a[j] < a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(b[j] < b[j+1]){
temp = b[j];
b[j] = b[j+1];
b[j+1] = temp;
}
}
}
i=j=times=wins=0;
x=y=n-1; //i,j,x,y分别指向田忌和国王最快和最慢的马
while(1){
if(times ==n)break; //已经比了n次,退出
if(a[i]>b[j]){i++;j++;times++;wins++;continue;} //如果田忌最快的马比国王最快的马的快,则田忌胜一场
if(a[i]<b[j]){x--;j++;times++;wins--;continue;} //如果田忌最快的马比国王最快的马的慢,则用田忌最慢的马和国王最快的比,田忌输一场
if(a[i]==b[j]){ //如果田忌最快的马和国王最快的马速度一样
if(a[x]>b[y]){x--;y--;times++;wins++;continue;} //如果田忌最慢的马比国王最慢的马快,则用田忌最慢的比国王最慢的,则田忌胜一场
if(a[x]<b[j]){x--;j++;times++;wins--;continue;} //如果田忌最慢的马比国王最快的马慢,则用田忌最慢的比国王最快的,则田忌输一场
else{x--;j++;times++;continue;} //如果是其他情况,则国王最快的马比田忌最慢的马慢或者一样,又有国王最快的马和田忌最快的马一样,则所有的马速度都一样了
}
}
printf("%d\n",wins*200);
}
return 0;
}
排名
(从这题开始,排序使用较快的sort()方法,多次冒泡的话时间复杂度会超出限制)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct student{
char id[25];
int sum;
}stu[1005];
int cmp(student x,student y){
if(x.sum!=y.sum)
return x.sum>y.sum;
else
return strcmp(x.id,y.id)>0?0:1;
}
int main()
{
int N,M,G,k,a,b;
int score[15];
while(~scanf("%d",&N)&&N){
scanf("%d%d",&M,&G);
for(int i=1;i<=M;i++)
scanf("%d",&score[i]);
a=b=k=0;
for(int i=0;i<N;i++){
scanf("%s%d",stu[i].id,&a);
stu[i].sum=0;
for(int j=0;j<a;j++){
scanf("%d",&b);
stu[i].sum+=score[b];
}
if(stu[i].sum>=G)
k++;
}
sort(stu,stu+N,cmp);
printf("%d\n",k);
for(int i=0;i<k;i++)
printf("%s %d\n",stu[i].id,stu[i].sum);
}
return 0;
}
百步穿杨
#include <stdio.h>
int main()
{
int t,N,num,i,j;
int ai[55],bi[55];
char c[55][35];
scanf("%d",&t);
while(t--){
scanf("%d",&N);
for( i=0;i<N;i++){
scanf("%d%d",&ai[i],&bi[i]);
}
for(i=0;i<N-1;i++){
for(j=0;j<N-1-i;j++){
if(ai[j]>ai[j+1]){
int temp = ai[j];
ai[j] = ai[j+1];
ai[j+1] = temp;
temp = bi[j];
bi[j] = bi[j+1];
bi[j+1] = temp;
}
}
}
for(i=0;i<N;i++){
num = ai[i]-2;
for(j=0;j<num;j++){
c[i][j]='-';
}
c[i][j] = '\0';
}
for(i=0;i<N;i++){
for(j=0;j<bi[i];j++){
printf(">+%s+>\n",c[i]);
}
printf("\n");
}
}
return 0;
}
开门人和关门人
#include<iostream>
#include<string>
using namespace std;
int main()
{
int m,n,i;
string str,str1,str2,e_name,l_name;
cin>>n;
while(n--)
{
cin>>m;
string s1="23:59:59",s2="00:00:00";
for(i=1;i<=m;i++)
{
cin>>str>>str1>>str2;
if(str1<=s1) {s1=str1;e_name = str;}
if(str2>=s2) {s2=str2;l_name = str;}
}
cout<<e_name<<" "<<l_name<<endl;
}
return 0;
}
What Is Your Grade?
(这题稍微复杂点,还是要细心,确定好记录的方式,最后要将人按照原来的顺序输出)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
int P;
char T[10];
int index;
int sc;
}s[105];
bool cmp1(student s1,student s2){
if(s1.P==s2.P){return strcmp(s1.T,s2.T)<0;}
else return s1.P > s2.P;
}
bool cmp2(student s1,student s2){
return s1.index < s2.index;
}
int main()
{
int N,i,j4,j3,j2,j1;
while(scanf("%d",&N) && N>0){
int num[10]={0};
j4=j3=j2=j1=0;
for(i=0;i<N;i++){
scanf("%d%s",&s[i].P,&s[i].T);
s[i].index = i;
num[s[i].P]++;
}
sort(s,s+N,cmp1);
for(i=0;i<N;i++){
s[i].sc = 50;
if(s[i].P==5) s[i].sc=100;
if(s[i].P==4){
if(j4<(num[s[i].P]/2)){j4++;s[i].sc=95;}
else s[i].sc=90;
}
if(s[i].P==3){
if(j3<(num[s[i].P]/2)){j3++;s[i].sc=85;}
else s[i].sc=80;
}
if(s[i].P==2){
if(j2<(num[s[i].P]/2)){j2++;s[i].sc=75;}
else s[i].sc=70;
}
if(s[i].P==1){
if(j1<(num[s[i].P]/2)){j1++;s[i].sc=65;}
else s[i].sc=60;
}
}
sort(s,s+N,cmp2);
for(i=0;i<N;i++){
printf("%d\n",s[i].sc);
}
printf("\n");
}
return 0;
}
Fighting for HDU
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int n,sc_a,sc_b;
int a[105],b[105];
while(scanf("%d",&n) && n){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&b[i]);
}
sort(a,a+n);
sort(b,b+n);
sc_a=sc_b=0;
for(int i=0;i<n;i++){
if(a[i]>b[i]){sc_a+=2;}
else if(a[i]==b[i]){sc_a+=1;sc_b+=1;}
else{sc_b+=2;}
}
printf("%d vs %d\n",sc_a,sc_b);
}
return 0;
}
Rank
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int Jackon,J_grade,J_rank,number,mark,counts=0;
int grade[1005]={0};
while(~scanf("%d",&Jackon)){
J_rank=1;counts=0;
while(scanf("%d%d",&number,&mark)&&number){
counts++;
if(number==Jackon) J_grade=mark;
grade[counts]=mark;
}
for(int i=1;i<=counts;i++){
if(grade[i]>J_grade) J_rank++;
}
printf("%d\n",J_rank);
}
return 0;
}
至此第一章就算是结束了,每天写写这个有助于提升自己的思维能力吧,但是不要忘记我的初衷就好