PAT 1069 1070 1071 1072
pat 1069 The Black Hole of Numbers
水题,代码如下:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 bool isSame(char buf[]) 8 { 9 int i = 1; 10 while(buf[i] != '\0') 11 { 12 if(buf[i] != buf[0])return false; 13 else i++; 14 } 15 return true; 16 } 17 18 int main() 19 { 20 int num; 21 scanf("%d", &num); 22 char buf[6]; 23 sprintf(buf, "%04d", num); 24 if(isSame(buf)) 25 { 26 printf("%04d - %04d = 0000", num, num); 27 return 0; 28 } 29 int len = strlen(buf); 30 do 31 { 32 sort(buf, buf+len, greater<char>()); 33 int decre = atoi(buf); 34 sort(buf, buf+len); 35 int incre = atoi(buf); 36 num = decre - incre; 37 sprintf(buf, "%04d", num); 38 printf("%04d - %04d = %04d\n", decre, incre, num); 39 }while(num != 6174); 40 return 0; 41 }
水题,按照单价贪心选择即可。注意的是题目中的月饼的存货量用double类型,用int第三个数据通不过。代码如下:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 using namespace std; 5 6 struct UnitPrice 7 { 8 double val; 9 int index; 10 }; 11 12 bool comp(UnitPrice a, UnitPrice b) 13 { 14 return a.val > b.val; 15 } 16 17 int main() 18 { 19 //freopen("input.txt","r",stdin); 20 int N,D; 21 scanf("%d%d", &N, &D); 22 double *amount = new double[N]; 23 double *price = new double[N]; 24 UnitPrice *unitPrice = new UnitPrice[N]; 25 for(int i = 0; i < N; i++) 26 scanf("%lf", &amount[i]); 27 for(int i = 0; i < N; i++) 28 { 29 scanf("%lf", &price[i]); 30 unitPrice[i].val = price[i] / amount[i]; 31 unitPrice[i].index = i; 32 } 33 sort(&unitPrice[0], &unitPrice[N], comp); 34 double profit = 0.0; 35 int j = 0; 36 while(D > 0 && j < N) 37 { 38 int k = unitPrice[j++].index; 39 if(D >= amount[k]) 40 { 41 profit += price[k]; 42 D -= amount[k]; 43 } 44 else 45 { 46 profit += (D*1.0/amount[k])*price[k]; 47 D = 0; 48 } 49 } 50 printf("%.2f\n" ,profit); 51 return 0; 52 }
水题,遍历字符串,统计每个单词出现次数即可。代码如下:
1 #include<iostream> 2 #include<string> 3 #include<map> 4 #include<algorithm> 5 using namespace std; 6 7 bool isValid(char c) 8 { 9 if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || 10 (c >= '0' && c <= '9')) 11 return true; 12 else return false; 13 } 14 15 int main() 16 { 17 string buf, maxWord; 18 getline(cin, buf); 19 transform(buf.begin(),buf.end(),buf.begin(), ::tolower); 20 map<string,int> words; 21 int i = 0, times = 0; 22 while( i < buf.length() ) 23 { 24 while( i < buf.length() && isValid(buf[i]) == false) i++; 25 if(i < buf.length()) 26 { 27 int start = i++; 28 while( i < buf.length() && isValid(buf[i]) == true) i++; 29 if( i <= buf.length())// 这里注意要<=,不能是< 30 { 31 string word = buf.substr(start, i-start); 32 if(words.find(word) == words.end()) 33 { 34 words[word] = 1; 35 if(times < 1){times = 1; maxWord = word;} 36 } 37 else 38 { 39 words[word] ++; 40 if(times < words[word] || 41 (times == words[word] && word < maxWord)) 42 { 43 times = words[word]; 44 maxWord = word; 45 } 46 } 47 } 48 } 49 } 50 cout<<maxWord<<" "<<times; 51 return 0; 52 }
题目的意思是选出一个加油站,求出加油站到几个house的距离的最小值,从这些最小值中选出一个最小的记为k(即距离station最近的的house),选择的加油站要使k最大。理解题目意思后就很简单了,只要依次以每个候选加油站为起点计算单源最短路径,然后计算k,选择k最大的加油站即可。代码如下:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<climits> 5 using namespace std; 6 const int INF = INT_MAX; 7 8 int index(char buf[], int houseNum) 9 { 10 if(buf[0] == 'G') 11 return atoi(buf+1) + houseNum - 1; 12 else 13 return atoi(buf) - 1; 14 } 15 16 //以src为起点的单源最短路径 17 void Dijkstra(int src, int dist[], int **graph, int n) 18 { 19 bool *used = new bool[n]; 20 for(int i = 0; i < n; i++) 21 {dist[i] = graph[src][i]; used[i] = false;} 22 for(int i = 1; i < n; i++) 23 { 24 int tmin = INF,k; 25 for(int j = 0; j < n; j++) 26 if(!used[j] && tmin > dist[j]) 27 { 28 tmin = dist[j]; 29 k = j; 30 } 31 used[k] = true; 32 for(int j = 0; j < n; j++) 33 if(dist[k] != INF && graph[k][j] != INF && 34 dist[k] + graph[k][j] < dist[j]) 35 { 36 dist[j] = dist[k] + graph[k][j]; 37 } 38 } 39 delete used; 40 } 41 int main() 42 { 43 //freopen("input.txt", "r", stdin); 44 int houseNum, stationNum,roadNum,range; 45 scanf("%d%d%d%d", &houseNum, &stationNum, &roadNum, &range); 46 const int nodeNum = houseNum + stationNum; 47 int **graph = new int*[nodeNum]; 48 for(int i = 0; i < nodeNum; i++) 49 { 50 graph[i] = new int[nodeNum]; 51 for(int j = 0; j < nodeNum; j++) 52 graph[i][j] = (i != j ? INF:0); 53 } 54 for(int i = 0; i < roadNum; i++) 55 { 56 char buf[10]; 57 scanf("%s", buf); int a = index(buf, houseNum); 58 scanf("%s", buf); int b = index(buf, houseNum); 59 scanf("%d", &graph[a][b]); 60 graph[b][a] = graph[a][b]; 61 } 62 63 double minDistance = -1.0, averageDistance = INF; 64 int Selectstation = -1; 65 int dist[nodeNum]; 66 for(int i = houseNum; i < nodeNum; i++) 67 { 68 Dijkstra(i, dist, graph, nodeNum); 69 double mindis = INF, averdis = 0.0; 70 bool flag = true; 71 for(int j = 0; j < houseNum; j++) 72 { 73 if(dist[j] > range){flag = false; break;} 74 averdis += dist[j]; 75 if(dist[j] < mindis)mindis = dist[j]; 76 } 77 if(flag == false)continue; 78 averdis /= houseNum; 79 if(mindis > minDistance) 80 { 81 minDistance = mindis; 82 averageDistance = averdis; 83 Selectstation = i; 84 } 85 else if(mindis == minDistance) 86 { 87 if(averdis < averageDistance) 88 { 89 averageDistance = averdis; 90 Selectstation = i; 91 } 92 } 93 } 94 if(Selectstation != -1) 95 printf("G%d\n%.1f %.1f\n", Selectstation+1-houseNum, minDistance, 96 averageDistance); 97 else printf("No Solution\n"); 98 return 0; 99 }
【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3405252.html