我们队解出了三道题:1003、1007、1010
1011题做了一个多小时,卡在了第二个样例上面,也就是对t趋近于无穷时的处理上面,思考的思路一直是怎样用程序在数学上处理一个数趋向于无穷,看了题解才发现思路就错了,其实还是找规律。启发:如果在某一个题上卡的时间过长,要及时更换思路,用新的方法解题。
1007题,开始读了半天没读懂题意,就直接放弃了,后来是李勇麒通过观察样例发现了规律,原来读不懂题意也能AC!启发:如果一个题的通过人数很多,但又读不懂题意,可以直接研究样例,通过样例找规律写程序。
1010题,直接模拟,直接过。
下面是1003的代码和思路:
Problem 1003:
根据题意,可以将快递所在的快递柜分成两部分,一部分是在特殊快递柜前面的快递柜,另一部分是在特殊快递柜后面的快递柜。对于在后面的快递柜,我们可以发现无论先取哪一个快递,最终所花费的距离都是一样的;而对于在前面的快递,只有按照编号从大到小的顺序取快递所花费的距离才是最小的。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1000000+8];
int main()
{
int t,i,j,m;
ll n,k;
cin>>t;
while(t--)
{
ll dis=0;
scanf("%lld%d%lld",&n,&m,&k);
for(i=0;i<m;i++)
{
scanf("%lld",&a[i]);
}
sort(a,a+m);
dis=k-1;
for(i=m-1;i>=1;i--)
{
if(a[i]>k)
{
dis+=a[i]-k;
dis+=a[i]-k;
}
else
{
dis+=k-a[i];
dis+=k-a[i];
}
}
if(a[0]<k)
{
dis+=k-1;
}
else
{
dis+=a[0]-k;
dis+=a[0]-1;
}
printf("%lld ",dis);
}
return 0;
}