杭电ACM step(1.3.1-1.3.8)

第一章的第三部分个人感觉稍微涉及到一些简单的排序算法了


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;
}

至此第一章就算是结束了,每天写写这个有助于提升自己的思维能力吧,但是不要忘记我的初衷就好

猜你喜欢

转载自blog.csdn.net/gw_csdn/article/details/86476987
今日推荐