PAT 1069 1070 1071 1072

pat 1069 The Black Hole of Numbers

水题,代码如下:                                                

PAT 1069 1070 1071 1072
 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 }
View Code

 

pat 1070 Mooncake

水题,按照单价贪心选择即可。注意的是题目中的月饼的存货量用double类型,用int第三个数据通不过。代码如下:

PAT 1069 1070 1071 1072
 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 }
View Code

pat 1071 Speech Patterns                                                  本文地址

水题,遍历字符串,统计每个单词出现次数即可。代码如下:              

PAT 1069 1070 1071 1072
 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 }
View Code

pat 1072 Gas Station                                                         本文地址

题目的意思是选出一个加油站,求出加油站到几个house的距离的最小值,从这些最小值中选出一个最小的记为k(即距离station最近的的house),选择的加油站要使k最大。理解题目意思后就很简单了,只要依次以每个候选加油站为起点计算单源最短路径,然后计算k,选择k最大的加油站即可。代码如下:

PAT 1069 1070 1071 1072
 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 }
View Code

 【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3405252.html

你可能感兴趣的:(pat)