//浙大2010:题目1010:A + B //读入两个小于100的正整数A和B,计算A+B. //其中A和B的每一位数字由对应的英文单词给出 //input: //three four + five six = //zero seven + eight nine = //output: //90 //96 #include <fstream> #include <string> #include <iostream> using namespace std; string base[]={"zero","one","two","three","four","five", "six","seven","eight","nine"}; int getOperator( string s ){ int i, j, result=0; string a, b; j = s.find(" "); if( j==-1 ) for( i=0; i<10; i++ ) if( s == base[i] ) return result+=i; a = s.substr(0,j); b = s.substr(j+1,s.length()-j-1); //cout << a << "." << b << "." << endl;// for( i=0; i<10; i++ ) if( a == base[i] ) result = 10*i; for( i=0; i<10; i++ ) if( b == base[i] ) return result+=i; } int main() { int i, j, k, m, n; int idx; //idx=index string s, s1, s2, a1, a2; ifstream cin("ZJU_1010.txt");// while( getline(cin,s) ){ idx = s.find("+"); s1 = s.substr(0,idx-1); s2 = s.substr(idx+2,s.length()-idx-4); //cout << s1 << "." << s2 << "." << endl;// k = getOperator(s1)+getOperator(s2); if( k ) cout << k << endl; } system("pause"); return 0; }
和清华06年的“题目1077:最大序列和”一致且更复杂些 算是清华也抄浙大一题?一来一回算是扯平了 莫非是好基友?!
//浙大2010:题目1011:最大连续子序列 //输出最大连续子序列的和 以及起点和终点元素 //如果最大连续子序列不唯一,则输出序号i和j最小的那个 //若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。 #include <fstream> #include <memory.h> #include <iostream> using namespace std; int main() { int i, j, k, m, n; int sum, start, end, temp, tStart, a, first; ifstream cin("ZJU_1011.txt");// while( cin >> n && n ){ cin >> a; sum = temp = start = first = a; for( i=1; i<n; i++ ){ cin >> a; if( temp > 0 ) temp += a; else //当temp<=0时 另起新temp序列 temp = tStart = a; if( temp > sum ){ sum = temp; start = tStart; end = a; } } if( sum < 0 ) cout << "0 " << first << " " << a << endl; else cout << sum << " " << start << " " << end << endl; } system("pause"); return 0; }
对时间的处理 我是转换成了数字 也可以直接比较处理字符串 应该会更快点吧
//浙大2010:题目1013:开门人和关门人 //根据机房签到、签离记录找出当天开门和关门的人 //第一行 N M (N天 M行) //记录格式:证件号码 签到时间 签离时间 //其中时间按“小时:分钟:秒钟”(各占2位)给出,证件号码是长度不超过15的字符串。 #include <fstream> #include <string> #include <iostream> using namespace std; int getTime( string s ){ return (s[7]-48)+(s[6]-48)*10+(s[4]-48)*100 +(s[3]-48)*1000+s[1]*10000+(s[0]-48)*100000; } int main() { int i, j, k, m, n; string id, arrive, leave, minID, maxID; int arriveT, leaveT, Min, Max; ifstream cin("ZJU_1013.txt");// while( cin >> n ){ for( j=0; j<n; j++ ){ cin >> m; Min=600000; Max=-1; for( i=0; i<m; i++ ){ cin >> id >> arrive >> leave; arriveT = getTime(arrive); leaveT = getTime(leave); if( Min > arriveT ) { Min = arriveT; minID = id; } if( Max < leaveT ) { Max = leaveT; maxID = id; } } cout << minID << " " << maxID << endl; } } system("pause"); return 0; }
C版的跑了80ms C++版跑了990ms(倒是也AC了 噗
//浙大2010:题目1014:排名 //找出最后通过分数线的考生,并将他们的成绩按降序打印。 //第1行给出考生人数N (0<N<1000)、考题数M (0<M<=10)、分数线G //第2行排序给出第1题至第M题的正整数分值; //以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、 //该生解决的题目总数m、以及这m道题的题号(题目号由1到M)。 //若有多名考生分数相同,则按他们考号的升序输出。 #include <fstream> #include <memory.h> #include <algorithm> #include <cstdio> #include <iostream> using namespace std; struct STUDENT{ char id[21]; int score; bool pass; }t[1000]; int getScore( int &M, int a[], bool AC[] ){ int score=0; for( int i=0; i<M; i++ ) if(AC[i]) score+=a[i]; return score; } bool cmp( STUDENT x, STUDENT y ){ if( x.score == y.score ){ if( strcmp(x.id,y.id)<0 ) return 1; else return 0; } return x.score > y.score; } int main() { int i, j, k, m, n; int N, M, G, a[10], fin; bool AC[10]; freopen("ZJU_1014.txt","r",stdin);// while( scanf("%d",&N)==1 && N ){ scanf("%d%d",&M,&G); for( i=0; i<M; i++ ) scanf("%d",&a[i]); for( i=0; i<N; i++ ){ //N个学生 scanf("%s%d",t[i].id,&m); //m=做成题目数 memset(AC,0,sizeof(AC)); for( j=0; j<m; j++ ){ scanf("%d",&fin); AC[fin-1] = 1; } t[i].score = getScore(M,a,AC); if( t[i].score<G ) t[i].pass = 0; else t[i].pass = 1; } int pt=0;//pt=pointer for( i=0; i<N; i++ ) if(t[i].pass) t[pt++]=t[i]; sort(t,t+pt,cmp); printf("%d\n",pt); for( i=0; i<pt; i++ ) printf("%s %d\n",t[i].id,t[i].score); } while(1);// return 0; }