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