CF758C Unfair Poll

 1.题意

  教室里有恰好n行m列学生,老师提问的顺序是第一行、第二行···第n行、第n-1行···第二行,往复循环,每一行提问的顺序都是从第一列到第m列。问被提问最多的学生被提问了多少次,被提问最少的学生被提问了多少次,指定的某个学生被提问了多少次。

 2.题解

  用二维数组存学生被提问的次数,行数:1、2、3、····、n-1、n、n-1、n-2、···、2为一个循环节,模拟即可,另外需要考虑只有一行的情况。

 3.代码

 1 //https://blog.csdn.net/lyg_air/article/details/77569620?utm_medium=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-OPENSEARCH-1.channel_param
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 const int maxn = 105;
 6 const ll INF = 1e18 + 5;
 7 ll a[maxn][maxn];
 8 int main() {
 9     ll n, m, k, x, y;
10     scanf("%lld%lld%lld%lld%lld", &n, &m, &k, &x, &y);
11     int sum = 0;
12     for(int i = 1; i <= n; i++) {
13         sum += m;
14     }
15     for(int i = n - 1; i >= 2; i--) {
16         sum += m;
17     }
18     
19     ll p = k / sum;
20     for(int i = 2; i <= n - 1; i++) {
21         for(int j = 1; j <= m; j++) {
22             a[i][j] += 2 * p;
23         }
24     }
25     for(int j = 1; j <= m; j++) {
26         a[1][j] += p;
27     }
28     if(n != 1) {
29         for(int j = 1; j <= m; j++) {
30             a[n][j] += p;
31         }
32     }
33     
34     k -= sum * p;
35     if(k) {
36         for(int i = 1; i <= n; i++){
37             for(int j = 1; j <= m; j++){
38                 a[i][j] += 1;
39                 k--;
40                 if(!k) {
41                     break;
42                 }
43             }
44             if(!k) {
45                 break;
46             }
47         }
48     }
49     if(k) {
50         for(int i = n - 1; i >= 2; i--) {
51             for(int j = 1; j <= m; j++) {
52                 a[i][j] += 1;
53                 k--;
54                 if(!k) {
55                        break;    
56                 }
57             }
58             if(!k) {
59                 break;
60             }
61         }
62     }
63     
64     ll ans1 = 0, ans2 = INF;
65     for(int i = 1; i <= n; i++) {
66         for(int j = 1; j <= m; j++) {
67             ans1 = max(ans1, a[i][j]);
68             ans2 = min(ans2, a[i][j]);
69         }
70     }
71     printf("%lld %lld %lld\n", ans1, ans2, a[x][y]);
72   
73     return 0;
74 }
View Code

 

CF864C Bus

 1.题意

   一辆汽车在x轴上从x=0处到x=a处往返k次旅行(从0->a算一次,从a->0算一次)。在开始时汽车油箱有b升油,汽车每行驶一单位距离消耗一升油,在x=f处有加油站,每次经过加油站都可以加满油或者不加油。问完成这k次旅行最少需要加油多少次,如果不能完成输出-1。

 2.题解

  模拟。

 3.代码

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 int main() {
 5     int a, b, f, k; 
 6     scanf("%d%d%d%d", &a, &b, &f, &k);
 7     int l = f;
 8     int r = a - f;
 9     int now = b - f; 
10     
11     if(now < 0) {
12         cout << "-1" << endl;
13         return 0;
14     }
15     int ans = 0;
16     for(int i = 1; i <= k - 1; i++) {  
17         if(i % 2 == 1) {
18             if(now >= 2 * r) {
19                 now -= 2 * r;    
20             } else {
21                 now = b - 2 * r;
22                 ans++;
23                 if(now < 0) {
24                     cout << "-1" << endl;
25                     return 0;
26                 }
27             }
28         } else {
29             if(now >= 2 * l) {
30                 now -= 2 * l;
31             } else {
32                 now = b - 2 * l;
33                 ans++;
34                 if(now < 0) {
35                     cout << "-1" << endl;
36                     return 0;
37                 }
38             }
39         }    
40     }
41     if(k % 2 == 1) {
42         if(now < r) {
43             now = b - r;
44             ans++;
45             if(now < 0) {
46                 cout << "-1" << endl;
47                 return 0;
48             }
49         }
50     } else {
51         if(now < l) {
52             now = b - l;
53             ans++;
54             if(now < 0) {
55                 cout << "-1" << endl;
56                 return 0;
57             }
58         }
59     }
60     cout << ans << endl; 
61     
62     return 0;
63 }
View Code

 

posted on 2020-10-30 11:43  吕瓜皮  阅读(94)  评论(0编辑  收藏  举报