2016ACM青岛区域赛题解

Posted 多一份不为什么的坚持

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016ACM青岛区域赛题解相关的知识,希望对你有一定的参考价值。

A、Relic Discovery_hdu5982

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 57    Accepted Submission(s): 49

Problem Description
Recently, paleoanthropologists have found historical remains on an island in the Atlantic Ocean. The most inspiring thing is that they excavated in a magnificent cave and found that it was a huge tomb. Inside the construction,researchers identified a large number of skeletons, and funeral objects including stone axe, livestock bones and murals. Now, all items have been sorted, and they can be divided into N types. After they were checked attentively, you are told that there areAi items of the i-th type. Further more, each item of the i-th type requires Bi million dollars for transportation, analysis, and preservation averagely. As your job, you need to calculate the total expenditure.
 
Input
The first line of input contains an integer T which is the number of test cases. For each test case, the first line contains an integer N which is the number of types. In the next N lines, the i-th line contains two numbers Ai and Bi as described above. All numbers are positive integers and less than 101.
 
Output
For each case, output one integer, the total expenditure in million dollars.
 
Sample Input
1 2 1 2 3 4
 
Sample Output
14
 
Source
 

 

Recommend
jiangzijing2015   |   We have carefully selected several similar problems for you:  5994 5993 5992 5991 5990 
思路:第一题很简单,求费用,把每次的乘积都加起来就行了。
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int n;
    int t;
    int a,b;
    scanf("%d",&t);
    for(int i=0;i<t;i++){
        scanf("%d",&n);
        int sum=0;
        for(int j=0;j<n;j++){
            scanf("%d %d",&a,&b);
            sum+=a*b;
        }
        printf("%d\n",sum);
    }

    return 0;
}

 

B、Pocket Cube_5983

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 23    Accepted Submission(s): 9


Problem Description
The Pocket Cube, also known as the Mini Cube or the Ice Cube, is the 2 × 2 × 2 equivalence of a Rubik’s Cube.
The cube consists of 8 pieces, all corners.
Each piece is labeled by a three dimensional coordinate (h, k, l) where h, k, l ∈ {0, 1}. Each of the six faces owns four small faces filled with a positive integer.
For each step, you can choose a certain face and turn the face ninety degrees clockwise or counterclockwise.
You should judge that if one can restore the pocket cube in one step. We say a pocket cube has been restored if each face owns four same integers.
 

 

Input
The first line of input contains one integer N(N ≤ 30) which is the number of test cases.
For each test case, the first line describes the top face of the pocket cube, which is the common 2 × 2 face of pieces
labelled by (0, 0, 1),(0, 1, 1),(1, 0, 1),(1, 1, 1). Four integers are given corresponding to the above pieces.
The second line describes the front face, the common face of (1, 0, 1),(1, 1, 1),(1, 0, 0),(1, 1, 0). Four integers are
given corresponding to the above pieces.
The third line describes the bottom face, the common face of (1, 0, 0),(1, 1, 0),(0, 0, 0),(0, 1, 0). Four integers are
given corresponding to the above pieces.
The fourth line describes the back face, the common face of (0, 0, 0),(0, 1, 0),(0, 0, 1),(0, 1, 1). Four integers are
given corresponding to the above pieces.
The fifth line describes the left face, the common face of (0, 0, 0),(0, 0, 1),(1, 0, 0),(1, 0, 1). Four integers are given
corresponding to the above pieces.
The six line describes the right face, the common face of (0, 1, 1),(0, 1, 0),(1, 1, 1),(1, 1, 0). Four integers are given
corresponding to the above pieces.
In other words, each test case contains 24 integers a, b, c to x. You can flat the surface to get the surface development
as follows.

+ - + - + - + - + - + - +
| q | r | a | b | u | v |
+ - + - + - + - + - + - +
| s | t | c | d | w | x |
+ - + - + - + - + - + - +
| e | f |
+ - + - +
| g | h |
+ - + - +
| i | j |
+ - + - +
| k | l |
+ - + - +
| m | n |
+ - + - +
| o | p |
+ - + - +
Output
For each test case, output YES if can be restored in one step, otherwise output NO.
 
Sample Input
4 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 6 6 6 6 1 1 1 1 2 2 2 2 3 3 3 3 5 5 5 5 4 4 4 4 1 4 1 4 2 1 2 1 3 2 3 2 4 3 4 3 5 5 5 5 6 6 6 6 1 3 1 3 2 4 2 4 3 1 3 1 4 2 4 2 5 5 5 5 6 6 6 6
 
Sample Output
YES YES YES NO
 
Source
 
Recommend
jiangzijing2015   |   We have carefully selected several similar problems for you:  5994 5993 5992 5991 5990 
思路:在比赛的时候理解错意思了,以为是判断能不能复原模仿,而没看到只需要一步。
魔方是2*2的,有三种转的方法,上面顺时针转90度,逆时针转,前面顺时针,前面逆时针,左边顺时针(相当于右边顺时针),左边逆时针(相当于左边逆时针)
还有再加上不操作算是一种,总共七种类,模拟出来就行了。
  1 #include <iostream>
  2 #include <cstdio>
  3 
  4 using namespace std;
  5 
  6 int a[7][5];
  7 int b[7][5];
  8 
  9 bool judge(){
 10     int i=0;
 11     for(int j=1;j<=6;j++){
 12         if(a[j][1]==a[j][2]&&a[j][2]==a[j][3]&&a[j][3]==a[j][4]){
 13             i++;
 14         }
 15     }
 16     if(i==6){
 17         return true;
 18     }else{
 19         return false;
 20     }
 21 }
 22 
 23 void opera1(){//前面顺时针
 24     int t1,t2;
 25     t1=a[6][3];
 26     t2=a[6][4];
 27 
 28     a[6][3]=a[1][3];
 29     a[6][4]=a[1][4];
 30 
 31     a[1][3]=a[5][3];
 32     a[1][4]=a[5][4];
 33 
 34     a[5][3]=a[3][2];
 35     a[5][4]=a[3][1];
 36 
 37     a[3][1]=t2;
 38     a[3][2]=t1;
 39 }
 40 void opera2(){//前面逆时针
 41     int t1,t2;
 42     t1=a[5][3];
 43     t2=a[5][4];
 44 
 45     a[5][3]=a[1][3];
 46     a[5][4]=a[1][4];
 47 
 48     a[1][3]=a[6][3];
 49     a[1][4]=a[6][4];
 50 
 51     a[6][3]=a[3][2];
 52     a[6][4]=a[3][1];
 53 
 54     a[3][1]=t2;
 55     a[3][2]=t1;
 56 }
 57 void opera3(){//上面顺时针
 58     int t1,t2;
 59     t1=a[2][1];
 60     t2=a[2][2];
 61 
 62     a[2][1]=a[6][3];
 63     a[2][2]=a[6][1];
 64 
 65     a[6][3]=a[4][4];
 66     a[6][1]=a[4][3];
 67 
 68     a[4][4]=a[5][2];
 69     a[4][3]=a[5][4];
 70 
 71     a[5][2]=t1;
 72     a[5][4]=t2;
 73 }
 74 void opera4(){//上面逆时针
 75     int t1,t2;
 76     t1=a[2][1];
 77     t2=a[2][2];
 78 
 79     a[2][1]=a[5][2];
 80     a[2][2]=a[5][4];
 81 
 82     a[5][2]=a[4][4];
 83     a[5][4]=a[4][3];
 84 
 85     a[4][4]=a[6][3];
 86     a[4][3]=a[6][1];
 87 
 88     a[6][1]=t2;
 89     a[6][3]=t1;
 90 }
 91 void opera5(){//左边顺指针
 92     int t1,t2;
 93     t1=a[1][1];
 94     t2=a[1][3];
 95 
 96     a[1][1]=a[4][1];
 97     a[1][3]=a[4][3];
 98 
 99     a[4][1]=a[3][1];
100     a[4][3]=a[3][3];
101 
102     a[3][1]=a[2][1];
103     a[3][3]=a[2][3];
104 
105     a[2][1]=t1;
106     a[2][3]=t2;
107 }
108 void opera6(){//左边逆时针
109     int t1,t2;
110     t1=a[1][1];
111     t2=a[1][3];
112 
113     a[1][1]=a[2][1];
114     a[1][3]=a[2][3];
115 
116     a[2][1]=a[3][1];
117     a[2][3]=a[3][3];
118 
119     a[3][1]=a[4][1];
120     a[3][3]=a[4][3];
121 
122     a[4][1]=t1;
123     a[4][3]=t2;
124 }
125 int main()
126 {
127     int n;
128     scanf("%d",&n);
129     while(n--){
130         for(int i=1;i<=6;i++){
131             for(int j=1;j<=4;j++){
132                 scanf("%d",&a[i][j]);
133                 b[i][j]=a[i][j];
134             }
135         }
136         if(judge()){
137             printf("YES\n");
138             continue;
139         }
140         opera1();
141         if(judge()){
142             printf("YES\n");
143             continue;
144         }
145         for(int i=1;i<=6;i++){
146             for(int j=1;j<=4;j++){
147                 a[i][j]=b[i][j];
148             }
149         }
150         opera2();
151         if(judge()){
152             printf("YES\n");
153             continue;
154         }
155         for(int i=1;i<=6;i++){
156             for(int j=1;j<=4;j++){
157                 a[i][j]=b[i][j];
158             }
159         }
160         opera3();
161         if(judge()){
162             printf("YES\n");
163             continue;
164         }
165         for(int i=1;i<=6;i++){
166             for(int j=1;j<=4;j++){
167                 a[i][j]=b[i][j];
168             }
169         }
170         opera4();
171         if(judge()){
172             printf("YES\n");
173             continue;
174         }
175         for(int i=1;i<=6;i++){
176             for(int j=1;j<=4;j++){
177                 a[i][j]=b[i][j];
178             }
179         }
180         opera5();
181         if(judge()){
182             printf("YES\n");
183             continue;
184         }
185         for(int i=1;i<=6;i++){
186             for(int j=1;j<=4;j++){
187                 a[i][j]=b[i][j];
188             }
189         }
190         opera6();
191         if(judge()){
192             printf("YES\n");
193             continue;
194         }
195         for(int i=1;i<=6;i++){
196             for(int j=1;j<=4;j++){
197                 a[i][j]=b[i][j];
198             }
199         }
200         printf("NO\n");
201     }
202     return 0;
203 }

 

C、Pocky_hdu5984

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 54    Accepted Submission(s): 20

Problem Description
Let’s talking about something of eating a pocky. Here is a Decorer Pocky, with colorful decorative stripes in the coating, of length L.
While the length of remaining pocky is longer than d, we perform the following procedure. We break the pocky at any point on it in an equal possibility and this will divide the remaining pocky into two parts. Take the left part and eat it. When it is not longer than d, we do not repeat this procedure.
Now we want to know the expected number of times we should repeat the procedure above. Round it to 6 decimal places behind the decimal point.
 
Input
The first line of input contains an integer N which is the number of test cases. Each of the N lines contains two float-numbers L and d respectively with at most 5 decimal places behind the decimal point where 1 ≤ d, L ≤ 150.
 
Output
For each test case, output the expected number of times rounded to 6 decimal places behind the decimal point in a line.
 
Sample Input
6 1.0 1.0 2.0 1.0 4.0 1.0 8.0 1.0 16.0 1.0 7.00 3.00
 
Sample Output
0.000000 1.693147 2.386294 3.079442 3.772589 1.847298
 
Source
 
Recommend
jiangzijing2015   |   We have carefully selected several similar problems for you:  5994 5993 5992 5991 5990 
思路:说实话比赛的时候根本不知道怎么做出来的。
好久之后才队友想起来,输出了一下log2,突然发现了规律。
赛后看别的队,一看0.693147就知道log2了,这就是做题多了有经验了啊。
但当时说的题解好像是求微积分,还是求导呢,把公式推导出来的。。。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n;
10     double a,b;
11     scanf("%d",&n);
12     while(n--){
13         scanf("%lf%lf",&a,&b);
14         if(a<=b){
15             printf("0.000000\n");
16             continue;
17         }
18         printf("%.6lf\n",log(a)-log(b)+1);
19     }
20     return 0;
21 }

 

 

 

 

以上是关于2016ACM青岛区域赛题解的主要内容,如果未能解决你的问题,请参考以下文章

ACM/ICPC2016 青岛区域赛

青岛理工大学第五届ACM交流赛 部分题解

2017 ACM区域赛现场赛 青岛站 E (polya计数)

hdu 5881 Tea (2016 acm 青岛网络赛)

青岛 2016ICPC 区域现场赛题目

2016 年青岛网络赛---Tea