1.平方差
暴力算法会超时,需要找到规律。是个数论问题。
#include<stdio.h>
int main()
{
int l,r;
int ans=0;
scanf("%d%d",&l,&r);
for(int i=l;i<=r;i++)
{
if(i%4==0|| i&1)
ans++;
}
printf("%d",ans);
return 0;
}
2.更小的数
上来先找数学规律,容易想到如果作为“头”的数大于作为“尾”的数,那么交换之后新数一定小于旧数。如果头=尾,写一个循环,接着比较头+1位置和尾-1位置的数,如果左边的数小于右边的数,那么说明这种情况符合题意,如果等于,就比较头+2和尾-2....如果大于,说明肯定不符合题意,直接退出循环。
#include<stdio.h>
#include<string.h>
int main()
{
char arr[5001];//题目说位数最大不超过5000,多一个存放\0
scanf("%s",arr);
int n=strlen(arr);
int ans=0;
for(int i=0;i+1<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(arr[i]>arr[j])
ans++;
else if(arr[i]==arr[j])
{
int left = i+1;
int right = j-1;
while(right>left)
{
if(arr[left]>arr[right])
{
ans++;
break;
}
else if(arr[left]<arr[right])
break;
right--;
left++;
}
}
}
}
printf("%d",ans);
return 0;
}