杭电ACMSteps中Chapter One——Section 3中所有ac代码及解析

来源:互联网 发布:java api 1.7 中文 编辑:程序博客网 时间:2024/06/06 03:01
//百步穿杨 //Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  //Total Submission(s): 3071 Accepted Submission(s): 1065  //// //Problem Description//时维九月,序属三秋,辽军大举进攻MCA山,战场上两军正交锋.辽军统帅是名噪一时的耶律-James,而MCA方则是派出了传统武将中草药123.双方经过协商,约定在十一月八日正午十分进行射箭对攻战.中草药123早早就开始准备,但是他是武将而不是铁匠,造弓箭的活就交给聪明能干的你了,现在告诉你每种弓箭规格,即箭身的长度,以及每种规格弓箭所需要的数目,要求你把需要的弓箭都输出.//弓箭的基本样子为 ">+---+>",其中"+---+"为箭身,数据保证箭身长度 > 2// // //Input//首先输入一个t,表示有t组数据,跟着t行://每行一个N (N < 50 ),接下去有N行,第i行两个整数Ai , Bi,分别代表需要箭身长度为Ai的弓箭Bi枝. (Ai < 30 , Bi < 10 )//输入数据保证每一个Ai都是不同的.//// // //Output//按照箭身的长度从小到大的顺序依次输出所有需要的弓箭,"每一种"弓箭后输出一个空行.//// // //Sample Input//1//4//3 4//4 5//5 6//6 7 // //Sample Output//>+-+>//>+-+>//>+-+>//>+-+>////>+--+>//>+--+>//>+--+>//>+--+>//>+--+>////>+---+>//>+---+>//>+---+>//>+---+>//>+---+>//>+---+>////>+----+>//>+----+>//>+----+>//>+----+>//>+----+>//>+----+>//>+----+> //算法思路:得到数据while循环打印就可以了,但是这个地方要注意一点,就是打印的时候是从小到大打印的。//#include<iostream>//#include<algorithm>//using namespace std;// struct arc{//int a;//int b;//};//int cmp(const arc p,const arc q)//{//return p.a<q.a;//}//int main()//{//int t;//cin>>t;//while(t--)//{//int N;//cin>>N;//arc *A= new arc[N];//声明一个结构体指针指声明的数组的首地址//int i=0;//for(int i=0;i<N;i++)//{//cin>>A[i].a>>A[i].b;//}//sort(A,A+N,cmp);////for(int i=0;i<N;i++)//{//while(A[i].b--)//{//cout<<">+";//int j=A[i].a-2;//while(j--)//{//cout<<"-";//}//cout<<"+>"<<endl;//}//cout<<endl;//}//}//return 0;//}
////shǎ崽 OrOrOrOrz// //Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  //Total Submission(s): 3144 Accepted Submission(s): 1009  //// ////Problem Description////Acmer in HDU-ACM team are ambitious, especially shǎ崽, he can spend time in Internet bar doing problems overnight. So many girls want to meet and Orz him. But Orz him is not that easy.You must solve this problem first.//The problem is ://Give you a sequence of distinct integers, choose numbers as following : first choose the biggest, then smallest, then second biggest, second smallest etc. Until all the numbers was chosen . //For example, give you 1 2 3 4 5, you should output 5 1 4 2 3////// //// ////Input////There are multiple test cases, each case begins with one integer N(1 <= N <= 10000), following N distinct integers. //// //// ////Output////Output a sequence of distinct integers described above.//// //// ////Sample Input////5//1 2 3 4 5//// //// ////Sample Output////5 1 4 2 3////  //题意:很明显是给你一串不同的数字,然后你按照最大最小最大最小依次输出//算法:先给输入的一段数字排序,然后交替输出。注意有多组测试数据和空格的输出//#include<iostream>//#include<algorithm>//using namespace std;//int main()//{//int N;//while(cin>>N)//{//int a[10001];////for(int i=0;i<N;i++)//{//cin>>a[i];//}////sort(a,a+N);//从小到大排序//int t=0;//for(int i=0,j=N-1;i<=j;j--,i++)//{//if(t==0)t=1;//else cout<<" ";////if(i==j)//cout<<a[j];//else//  cout<<a[j]<<" "<<a[i];//这个地方最后一个数据没有空格的输出//}//cout<<endl;//}//return 0;//}

////排序// //Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)  //Total Submission(s): 3390 Accepted Submission(s): 978  //// ////Problem Description////输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。////你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。//////// //// ////Input////输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  ////输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。////// //// ////Output////对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。////// //// ////Sample Input////0051231232050775//// //// ////Sample Output////0 77 12312320////  //题意:用5当做是空格。分割之后排序输出。//算法:对数组进行预处理,遍历把多个5变成一个5,然后再遍历一边整理到另外一个数组,对另外一个数组进行排序输出。//数组的输入可见应该是字符串输入//#include<iostream>//#include<algorithm>//using namespace std;////int main()//{//char s[1001];////while(cin>>s)//{//int a[1001]={0};//int flag=0;//int k=0;//int sum=0;////for(int i=0;s[i]!='\0';)//{//if(s[i]=='5')//{//i++;//}//while(s[i]!='5'&&s[i]!='\0'){//a[k]=a[k]*10+s[i]-'0';//i++;//flag=1;//}//if(flag==1)//{//flag=0;//k++;//}//}//sort(a,a+k);//对数组进行从大到小排序//for(int i=0;i<k;i++)//{//if(i==k-1)//cout<<a[i];//else//cout<<a[i]<<" ";//}//cout<<endl;//}//return 0;//}

////考试排名// //Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  //Total Submission(s): 2181 Accepted Submission(s): 788  //// ////Problem Description////C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?//我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。//例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:////////若每次错误提交的罚分为20分,则其排名从高到低应该是这样的://Josephus 5 376//John 4 284//Alice 4 352//Smith 3 167//Bob 2 325//Bush 0 0////// //// ////Input////输入数据的第一行是考试题数n(1≤n≤12)以及单位罚分数m(10≤m≤20),每行数据描述一个学生的用户名(不多于10个字符的字串)以及对所有n道题的答题现状,其描述采用问题描述中的数量标记的格式,见上面的表格,提交次数总是小于100,AC所耗时间总是小于1000。//////// //// ////Output////将这些学生的考试现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。////// //// ////Sample Input////8 20//Smith  -1-16800120390//John  116-211008255(1)0//Josephus  72(3)12610-304721(2)-2//Bush  0-1-800000//Alice  -267(2)13-1013379(1)-1//Bob  0057(5)00168-70//// //// ////Sample Output////Josephus    5  376//John        4  284//Alice       4  352//Smith       3  167//Bob         2  325//Bush        0    0// //题意,我想已经很明确了。这一题考查的东西还蛮多的。//算法:列举需要解决的问题://1.存储的问题,用结构体,//2.输入的问题,采用边输入边计算的方式//3.考察排序sort的应用。//4.输入的问题,需要注意格式setw()//#include<iostream>//#include<algorithm>//#include<iomanip>//using namespace std;//struct student{//char name[11];//名字//int num;//ac数//int time;//耗费时间//}stu[10000];//bool cmp(const student a,const student b)//{//if(a.num!=b.num)//return a.num>b.num;//else if(a.time!=b.time)//return a.time<b.time;//else //return (strcmp(a.name,b.name)<0);//}//int main()//{//int n,m;//////while(cin>>n>>m)//{//int i=0;//while(cin>>stu[i].name)//{////if(strcmp(stu[i].name,"EOF")==0)break;////stu[i].num=0;//stu[i].time=0;////int k;//输入的数////char c;//int t=n;//while(t&&cin>>k)//{//if(k>0)//{//stu[i].num++;//    int s=0;//有括号的时候输入到括号中的数//            if(getchar()=='(')//{//cin>>s;//cin>>c;//}//stu[i].time+=k+s*m;//}//t--;//}//i++;//}//sort(stu,stu+i,cmp);//for(int j=0;j<i;j++)//cout<<left<<setw(10)<<stu[j].name<<' '<<right<<setw(2)<<stu[j].num<<' '<<right<<setw(4)<<stu[j].time<<endl;//}//return 0;//}

//Saving HDU //Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  //Total Submission(s): 1998 Accepted Submission(s): 883  //// //Problem Description//话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了。显然,作为多年拼搏的商人,XHD不会坐以待毙的。//  一天,当他正在苦思冥想解困良策的时候,突然想到了自己的传家宝,那是公司成立的时候,父亲作为贺礼送来的一个锦囊,徐父当时交代,不到万不得已的时候,不要打开它。“现在不正是最需要的时候吗?”,一边想,XHD一边找到了这个精心保管的锦囊,打开一看,里面只有一句话“杭城北麓千人洞有宝”。//  二话不说,XHD拿起一个大口袋就出发了,这个千人洞他是知道的,小的时候,爸爸曾经带他来过这个隐蔽的路口,并告诉他,这是千人洞。他现在才明白爸爸当初这句话的含义。//  尽管有点印象,XHD还是花了很大的精力才找到这个异常隐蔽的洞口,走进一看,几乎惊呆了,真的是眼花缭乱!不过尽管宝贝的种类不少,但是每种宝贝的量并不多,当然,每种宝贝单位体积的价格也不一样,为了挽救HDU,现在请你帮忙尽快计算出来XHD最多能带回多少价值的宝贝?(假设宝贝可以分割,分割后的价值和对应的体积成正比)//// // //Input//输入包含多个测试实例,每个实例的第一行是两个整数v和n(v,n<100),分别表示口袋的容量和宝贝的种类,接着的n行每行包含2个整数pi和mi(0<pi,mi<10),分别表示某种宝贝的单价和对应的体积,v为0的时候结束输入。//// // //Output//对于每个测试实例,请输出XHD最多能取回多少价值的宝贝,每个实例的输出占一行。//// // //Sample Input//2 2//3 1//2 3//0 // //Sample Output//5////////经过锦囊相助,HDU会脱离危机吗?//欲知后事如何,且听下回分解—— //题意:相信上面介绍的已经很明确了//算法:贪心,按照价值大,体积小进行排序,最后一个放不下的时候按照比例来放//#include<iostream>//#include<algorithm>//using namespace std;////struct treasure//{//int pi;//价值//int mi;//体积//}tre[101];////int cmp(const treasure a,const treasure b)//{//if(a.pi!=b.pi)return a.pi>b.pi;//else//return a.mi<b.mi;//}//int main()//{//int v,n;//while(cin>>v>>n&&v!=0)//{//for(int i=0;i<n;i++)//{//cin>>tre[i].pi>>tre[i].mi;//}//sort(tre,tre+n,cmp);////int num=0;//计算总价值//for(int i=0;i<n;i++)//{//if(v>tre[i].mi)//{//num+=tre[i].pi*tre[i].mi;//v-=tre[i].mi;//}//else//{//num+=v*tre[i].pi;//break;//}//}//cout<<num<<endl;//}//return 0;//}

//Fighting for HDU //Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  //Total Submission(s): 1831 Accepted Submission(s): 936  //// //Problem Description//在上一回,我们让你猜测海东集团用地的形状,你猜对了吗?不管结果如何,都没关系,下面我继续向大家讲解海东集团的发展情况://在最初的两年里,HDU发展非常迅速,综合各种ACM算法生成的老鼠药效果奇好,据说该药专对老鼠有效,如果被人误食了,没有任何副作用,甚至有传闻说还有健胃的效果,不过这倒没有得到临床验证。所以,公司的销量逐年递增,利润也是节节攀升,作为股东之一的公主负责财务,最近半年,她实在辛苦,多次因为点钞票造成双手抽筋而住院,现在在她面前你根本不要提到“钞票”二字,甚至“money”也不行,否则她立马双手抽筋,唉,可怜的公主…//海东集团的发展令国人大为振奋,不过也引起了邻国同行业“东洋小苟株式会社”的嫉妒,眼看海东集团逐渐把他们原来的市场一一占领,心中自是不甘,于是派了n个人前来挑衅,提出要来一场比试真功夫的中日擂台赛,输的一方要自动退出老鼠药市场!//他们提出的比赛规则是这样的://1.  每方派出n个人参赛;//2.  出赛的顺序必须是从弱到强(主要担心中国人擅长的田忌赛马);//3.  每赢一场,得两分,打平得一分,否则得0分。//东洋小苟果然够黑,不过他们万万没有想到,HDU可是卧虎藏龙,不仅有动若脱兔的Linle,还有力大如牛的伪**,更有下沙健美先生HeYing以及因为双手抽筋而练成鹰爪功的月亮公主,估计小苟他们也占不到什么便宜。//假设每个队员的能力用一个整数来表示,你能告诉我最终的结果吗?//// // //Input//输入包含多组测试数据,每组数据占3行,首先一行是一个整数n(n<100),表示每方上场队员的人数,接着的二行每行包含n个整数,分别依次表示中日两方人员的能力值,n为0的时候结束输入。//// // //Output//对于每个测试实例,请输出比赛的结果,结果的格式如样例所示(数字和vs之间有且仅有一个空格),其中,HDU的比分在前。//每个实例的输出占一行。//// // //Sample Input//3//5 2 6//1 3 4//0 // //Sample Output//6 vs 0//////这次的擂台赛,HDU能赢吗?欲知后事如何,且听下回分解—— //题意:题意大家看一下都懂吧,一一对决,计算分数//算法,sort排序,比较,计算分数,输出//这个题很简单但是有地方没写好导致wa了好几次,而且没有检查出来,原始是,anum和bnum要在while中赋值,要不然下一轮anum和bnum的值不是从0开始的//#include<iostream>//#include<algorithm>//using namespace std;//int main()//{//int n,i;//int a[100],b[100];//while(cin>>n&&n)//{//for(i=0;i<n;i++)//cin>>a[i];//for(i=0;i<n;i++)//cin>>b[i];////sort(a,a+n);//sort(b,b+n);//int anum=0,bnum=0;//for(i=0;i<n;i++)//{//if(a[i]>b[i])anum+=2;//else if(a[i]==b[i])//{//anum++;//bnum++;//}//else bnum+=2;//}//cout<<anum<<" vs "<<bnum<<endl;//}//return 0;//}

//排列2 //Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)  //Total Submission(s): 2448 Accepted Submission(s): 774  //// //Problem Description//Ray又对数字的列产生了兴趣://现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。//// // //Input//每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。//// // //Output//对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。//每组输出数据间空一行,最后一组数据后面没有空行。//// // //Sample Input//1 2 3 4//1 1 2 3//0 1 2 3//0 0 0 0 // //Sample Output//1234 1243 1324 1342 1423 1432//2134 2143 2314 2341 2413 2431//3124 3142 3214 3241 3412 3421//4123 4132 4213 4231 4312 4321////1123 1132 1213 1231 1312 1321//2113 2131 2311//3112 3121 3211////1023 1032 1203 1230 1302 1320//2013 2031 2103 2130 2301 2310//3012 3021 3102 3120 3201 3210 //题意很明确,给出四个数输出所有的排列千位一样的在一行,从小到大输出//算法:dfs求出全排列,并在dfs递归中输出。//以下代码为测试全排列的代码//#include<iostream>//using namespace std;//int k=0;//void print_permutation(int n,int A[],int a[],int arr[][4],int cur)//{//int i,j;//if(cur==n)//{//for(i=0;i<n;i++)//arr[k][i]=A[i];//k++;//}//else for(i=0;i<n;i++)//{//int ok=1;//for(j=0;j<cur;j++)//if(A[j]==a[i])ok=0;//if(ok)//{//A[cur]=a[i];//print_permutation(n,A,a,arr,cur+1);//}//}//}//int main()//{//int A[4];//int a[4]={1,3,5,7};//int arr[24][4];//    print_permutation(4,A,a,arr,0);//for(int i=0;i<24;i++)//{//for(int j=0;j<4;j++)//cout<<arr[i][j]<<" ";//cout<<endl;//}//return 0;//}//#include <iostream>  //#include <algorithm>  //using namespace std;  //int flag,flag_fir;  //void print_permutation(int n,int *P,int *A,int cur){  //    int i,j;  //    if(cur==n){  //        if(A[0]){    //如果第一个数不为0            //            if(A[0]!=flag){   //如果第一个数不和之前的第一位数字一样就换行//                if(!flag_fir)    //第一次进入程序不换行。     //                    cout<<endl;  //                flag_fir=0;   //以后每一次都换行//                flag=A[0];  //并且把当前的首位赋值给flag//            }  //            else cout<<" ";   //如果A[0]与flag相同的话打印空格,然后打印A      //            for(i=0;i<n;i++)   //            cout<<A[i];  //        }  //    }  //    else //for(i=0;i<n;i++)  //{//        if(!i||P[i]!=P[i-1])//{  //        int c1=0,c2=0;  //        for(j=0;j<cur;j++) //这个地方查询出现的p是否已经在A中//if(A[j]==P[i]) //c1++;////        for(j=0;j<n;j++) //这个地方是确定p中是不是还有和A中相同的数//if(P[j]==P[i]) //c2++;  //        //if(c1<c2){  //如果p中和p[i]相同的数大于A中和p[i]相同的数证明p中还存在需要放入A中的数//            A[cur]=P[i];  //            print_permutation(n,P,A,cur+1);  //} //} //    }  //}  //int main()  //{  //    int n,A[4],cur;  //    int P[4];  //    int flag_shit=1;  //    int S[1000][4];  //    int i;  //  for(i=0;;i++)//{  //        cin>>S[i][0]>>S[i][1]>>S[i][2]>>S[i][3];  //        if(!(S[i][0]||S[i][1]||S[i][2]||S[i][3]))  //        break;  //    }  //  for(int k=0;k<i;k++)  //    {  //        P[0]=S[k][0];  //        P[1]=S[k][1];  //        P[2]=S[k][2];  //        P[3]=S[k][3]; //        flag=-1;  //        flag_fir=1;  //        sort(P,P+4);      //        cur=0;  //        print_permutation(4,P,A,cur);//cout<<endl;//  if(k!=i-1) cout<<endl;  //每组数据间都有一行空行,但是最后一行没有。//     }  //    return 0;  //}  //#include<iostream>//#include<algorithm>//using namespace std; //int flag,flag1;//void dfs(int n,int p[],int A[],int cur)//{//if(cur==n)//{//if(A[0])//{//if(A[0]!=flag)//如果第一个数字和之前的第一个数字不相同说明要换行了//{//if(!flag1)//且这个数不是第一组数据的时候//{//cout<<endl;//}//flag=A[0];//flag1=0;//}//else//cout<<" ";//for(int i=0;i<n;i++)//cout<<A[i];//}//}////else //{//for(int i=0;i<n;i++)//{//if(!i||p[i]!=p[i-1])//排除掉输入数据中两个相同的,其中i=0的时候用!i使条件为真//{//int c1=0,c2=0;//for(int j=0;j<cur;j++)//if(A[j]==p[i])c1++;//计算剩下的p中与当前A中相同的数的个数//for(int j=0;j<n;j++)//if(p[j]==p[i])c2++;//计算p中自身p[i]相同的数的个数//if(c1<c2)//当起一个小于第二个的时候才说明p中有相同的但是还没有用//{//A[cur]=p[i];//dfs(n,p,A,cur+1);//}//}//}////}//}////int main()//{//int A[4];//int p[4];//int s[1000][4];//int i=0;//int cur;//while((cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3])&&(s[i][0]||s[i][1]||s[i][2]||s[i][3]))//i++;//for(int k=0;k<i;k++)//{//p[0]=s[k][0];//p[1]=s[k][1];//p[2]=s[k][2];//p[3]=s[k][3];//flag=-1; //    flag1=1; //这个地方的flag不要再有int的了。再有格式又错误了//    sort(p,p+4);//对输入的数据排序//cur=0;//        dfs(4,p,A,0);//cout<<endl;//if(k!=i-1)cout<<endl;//}//return 0;//}

//Who's in the Middle //Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)  //Total Submission(s): 2399 Accepted Submission(s): 903  //// //Problem Description//FJ is surveying his herd to find the most average cow. He wants to know how much milk this 'median' cow gives: half of the cows give as much or more than the median; half give as much or less. ////Given an odd number of cows N (1 <= N < 10,000) and their milk output (1..1,000,000), find the median amount of milk given such that at least half the cows give the same amount of milk or more and at least half give the same or less.//// // //Input//* Line 1: A single integer N ////* Lines 2..N+1: Each line contains a single integer that is the milk output of one cow.//// // //Output//* Line 1: A single integer that is the median milk output.//// // //Sample Input//5//2//4//1//3//5 // //Sample Output//3////Hint //INPUT DETAILS: ////Five cows with milk outputs of 1..5 ////OUTPUT DETAILS: ////1 and 2 are below 3; 4 and 5 are above 3.// //题意:给一个奇数N,然后是N行,每行一个整数,求出来这些整数的中位数。比如题上给出5个数,3是中位数,两个比3小,两个比他大//算法:将这个N个奇数放到一个数组里,排序之后求中间那个数//#include<iostream>//#include<algorithm>//using namespace std;//int main()//{//int N;//while(cin>>N){//int a[10001];//for(int i=0;i<N;i++)//cin>>a[i];//sort(a,a+N);//cout<<a[N/2]<<endl;//}//return 0;//}