Codeforces Round #695 (Div. 2)

A. Wizard of Orz

题意:就是一共n个电子表,最初都是从0开始显示,任何时间你都可以指定特定的一块钟表停下,那么他附近的就会再走一秒再停下,那么这个附近的会再走一秒再停下,以此类推……直到所有的全部停下,问所有的表停下以后,显示的最大的数字是多少

思路:所有的数都是从左往右数第二位显示8的时候停下,9890123456……

当时忽略掉的点:1)以为是98789这种,其实这样是不对的,仔细想想,最大的肯定在前面,按照当初的想法就相当于把不确定的重心往后移,这样只会让越靠前的变小,最终目的只和越靠前的数字相关

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxx=2e5+10;//9878  9890
 8 int main(){
 9     int t;
10     scanf("%d",&t);
11     while(t--){
12         int n;
13         scanf("%d",&n);
14        int a[maxx]={0};
15         if(n==1){
16             printf("9\n");
17         }else if(n==2){
18             printf("98\n");
19         }else if(n==3){
20             printf("989\n");
21         }else {
22             printf("989");
23             for(int i=0;i<n-3;i++){
24                 printf("%d",i%10);
25             }
26             printf("\n");
27  
28  
29  
30  
31         }
32     }
33 }
View Code

B. Hills And Valleys

题意:就是里面存在高山和山谷,高山和山谷就是这个数组的值,可以选择数组中的一个数变成任意数,也可以不改变,问最小的值是多少

思路:直接进行判断寻找,如果是山峰或者是山谷,那么就判断如果把这个数改变成和前一位相同的数字,那么会影响多少值的变化,如果把数字改成和后一个相同的又会改变成多少

当时忽略掉的点:总以为是前缀和之类的问题,想复杂了,因为觉得直接进行判断可能会浪费掉时间,前缀和的想法可能会更快,其实这并不是前缀和的题目,前缀和直接进行变化,其实不能保证是不是会影响其他的

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxx=3e5+10;//9878  9890�������ϵ���
 8 int a[maxx]={0};
 9 int b[maxx]={0};
10 int main(){
11     int t;
12     scanf("%d",&t);
13     while(t--){
14         int n;
15         scanf("%d",&n);
16         for(int i=0;i<n;i++){
17             scanf("%d",&a[i]);
18         }
19         for(int i=0;i<n;i++){
20             b[i]=0;
21         }
22         int sum=0;
23         int minn=0;
24         for(int i=1;i<n-1;i++){
25             if(a[i]>a[i-1]&&a[i]>a[i+1]){
26                  sum++;
27             }
28             if(a[i]<a[i-1]&&a[i]<a[i+1]){
29                 sum++;
30             }
31         }
32         for(int i=1;i<n-1;i++){
33             int t=a[i];
34             int now=0;
35             int flag=0;
36             if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1])){
37                  now++;
38                  if(a[i-1]>a[i-2]&&a[i-1]>a[i]&&i-2>=0){
39                     now++;
40                  }else if(a[i-1]<a[i-2]&&a[i-1]<a[i]&&i-2>=0){
41                     now++;
42                  }
43                  if(a[i+1]>a[i]&&a[i+1]>a[i+2]&&i+2<n){
44                     now++;
45                  }else if(a[i+1]<a[i]&&a[i+1]<a[i+2]&&i+2<n){
46                     now++;
47                  }
48                  a[i]=a[i-1];
49                  if(a[i+1]>a[i]&&a[i+1]>a[i+2]&&i+2<n){
50                     flag++;
51                  }else if(a[i+1]<a[i]&&a[i+1]<a[i+2]&&i+2<n){
52                     flag++;
53                  }
54                  minn=max(now-flag,minn);
55                  flag=0;
56                  a[i]=a[i+1];
57                  if(a[i-1]>a[i-2]&&a[i-1]>a[i]&&i-2>=0){
58                     flag++;
59                  }else if(a[i-1]<a[i-2]&&a[i-1]<a[i]&&i-2>=0){
60                     flag++;
61                  }
62                  minn=max(now-flag,minn);
63             }
64             a[i]=t;
65  
66         }
67         printf("%d\n",sum-minn);
68     }
69 }
View Code

想法:真的是想着赶紧回复状态,这状态真的有点差,关于做题就是,仔细读题,不要把简单的问题想的怪复杂的,看数字范围有时候并没有想象中的那么复杂,也许暴力就能过

posted @ 2021-01-23 16:24  bonel  阅读(58)  评论(0)    收藏  举报