PAT 2012 冬

A Shortest Distance

  题意相当于一个环,找出两点间从不同方向得到的距离中的最小值。

PAT 2012 冬
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <vector>
 5 
 6 using namespace std;
 7 vector<int> disVec;
 8 int main()
 9 {
10     int N, tmpDis;
11     cin >> N;
12     disVec.resize(N+1,0);
13     for(int i = 2; i <= N; ++ i)
14     {
15         cin >> tmpDis;
16         disVec[i] = disVec[i-1] + tmpDis;
17     }
18     cin >> disVec[0];
19     int M, tmpSt, tmpEnd;
20     cin >> M;
21     for(int i = 0; i < M; ++ i)
22     {
23         cin >> tmpSt >> tmpEnd;
24         if(tmpSt > tmpEnd)
25             swap(tmpSt, tmpEnd);
26         tmpDis = min(disVec[tmpEnd]-disVec[tmpSt], disVec[tmpSt]+disVec[0]-disVec[tmpEnd]+disVec[N]);
27         cout << tmpDis << endl;
28     }
29 }
View Code

B Student List for Course

  课程清单,这个题目有点意思,我是通过把cin,cout 改成printf和scanf让它不超时的

  试过用set会超时,暂时没有想到更好的方法。

PAT 2012 冬
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <set>
 5 #include <string>
 6 #include <vector>
 7 
 8 using namespace std;
 9 vector<int> disVec;
10 vector<string> classInfo[2510];
11 int main()
12 {
13     int N, K, tmpNum, tmpClass;
14     string tmpStr;
15     cin >> N >> K;
16     for(int i = 1; i <= N; ++ i)
17     {
18         cin >> tmpStr;scanf("%d", &tmpNum);
19         while(tmpNum--)
20         {
21             scanf("%d", &tmpClass);
22             classInfo[tmpClass].push_back(tmpStr);
23         }
24     }
25     for(int i = 1; i <= K; ++ i)
26     {
27         vector<string> tmpVec = classInfo[i];
28         sort(tmpVec.begin(), tmpVec.end());
29         printf("%d %d\n", i, tmpVec.size());
30         for(auto it = tmpVec.begin(); it != tmpVec.end(); ++ it)
31         {
32             printf("%s\n", (*it).c_str());
33         }
34     }
35     return 0;
36 }
View Code

C Find Coins

  因为需要两个硬币,所以可以排序后,用双指针法,从两端向中间找,因为在找到合适两个硬币前,一旦左侧硬币加右侧硬币超过了所需面值,右边这个硬币肯定是不可能满足条件的。

PAT 2012 冬
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <set>
 5 #include <string>
 6 #include <vector>
 7 
 8 using namespace std;
 9 vector<int> coinVal;
10 int main()
11 {
12     int N, M, tmpVal;
13     cin >> N >> M;
14     coinVal.resize(N);
15     for(int i = 0; i < N; ++ i)
16         cin >> coinVal[i];
17     int tmpLast = N-1;
18     sort(coinVal.begin(), coinVal.end());
19     for(int i = 0; i < tmpLast; ++ i)
20     {
21         while(coinVal[i] + coinVal[tmpLast] > M)
22             tmpLast --;
23         if(tmpLast != i && coinVal[i] + coinVal[tmpLast] == M)
24         {
25             cout << coinVal[i] << " " << coinVal[tmpLast];
26             return 0;
27         }
28     }
29     cout << "No Solution";
30     return 0;
31 }
View Code

D Counting Ones

  这个题目需要先利用数学知识找一下规律,会发现每一位产生的1的个数是有规律的,见代码while循环部分。

  (其中numArray[i]是第i位数值,multBase是0-9、0-99、0-999...中包含1的个数,digitBase是0,10,100,1000...)

PAT 2012 冬
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <string>
 6 #include <vector>
 7 
 8 using namespace std;
 9 int charToNum(char c)
10 {
11     return c-'0';
12 }
13 int n;
14 char numStr[15];
15 int numArray[15];
16 int len;
17 int numDeal(int tmpN)
18 {
19     int tmpNum = 0;
20     int digitBase = 1;
21     int multBase = 0;
22     while(tmpN >= 0)
23     {
24         if(numArray[tmpN] == 1)
25         {
26             tmpNum += numArray[tmpN] * multBase + n%digitBase+1;
27         }
28         else if(numArray[tmpN] > 1)
29         {
30             tmpNum += numArray[tmpN] * multBase + digitBase;
31         }
32         multBase = 10 * multBase + digitBase;
33         digitBase *= 10;
34         tmpN--;
35     }
36     return tmpNum;
37 }
38 int main()
39 {
40 
41     cin >> n;
42     sprintf(numStr, "%d", n);
43     len = strlen(numStr);
44     for(int i = 0; i < len; ++ i)
45         numArray[i] = charToNum(numStr[i]);
46     int num = numDeal(len-1);
47     cout << num;
48     return 0;
49 }
View Code

 

上一篇:HTML标签天天练3--


下一篇:HTML标签天天练1--