首先是简化代码,如何简化,以及c++内置代码的精简与下标的利用,这些都是要重新去抠的细节
1114D题,首先必须是邻近元素的操作,发现,寻找最频繁的元素是一个正确的选择,另外就是发现其余元素都需要操作且只需要操作一次,证明显然
根据题解的代码写出了自己的一份代码
1 #include<bits/stdc++.h> 2 typedef long long ll; 3 int num[(int)1e6+5]; 4 int occur[(int)1e6+5]; 5 int MAXN=(int)2e5+5; 6 7 int main(){ 8 int n; 9 std::cin>>n; 10 //long long max=0,maxp; 11 for(int i=1;i<=n;i++) 12 { 13 scanf("%d",&num[i]); 14 ++occur[num[i]]; 15 } 16 17 int max=std::max_element(occur,occur+MAXN)-occur; 18 int pos=std::find(num+1,num+n+1,max)-num; 19 //std::cout<<max; 20 std::cout<<n-occur[max]<<"\n"; 21 for(int i=pos-1;i>=1;i--){ 22 if(num[i]<num[i+1]) 23 { 24 std::cout<<1<<" "<<i<<" "<<i+1<<"\n"; 25 } 26 else 27 { 28 std::cout<<2<<" "<<i<<" "<<i+1<<"\n"; 29 } 30 num[i]=num[i+1]; 31 } 32 for(int i=pos+1;i<=n;i++){ 33 if(num[i]==num[i-1]) continue; 34 if(num[i]<num[i-1]) 35 { 36 std::cout<<1<<" "<<i<<" "<<i-1<<"\n"; 37 } 38 else 39 { 40 std::cout<<2<<" "<<i<<" "<<i-1<<"\n"; 41 } 42 num[i]=num[i-1]; 43 } 44 return 0; 45 }