//昨天在杭電上有了重現賽,組隊打了一下,這個題沒做出來,公式推的過程有點複雜,以後要多做做這種思維題,其實只要推出公式,代碼就那麼幾行,放題~~~
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1006&cid=867
題意:
先輸入t(有多少組樣例),再輸入n,接下來n組radi(1<=i<=n)
k滿足一下五個問題(我把問題細化了),可以接收i的完美信號:
1.k<i,k在[i-radi+1,i+radi-1]
2. 加入了一個類似於中轉站的j(k<=j<i)
3.k在[i-radi+1,i+radi-1]
4.k在[j-radj+1,j+radj-1]
5.(S表示距離)Skj>=Sji
求的是有多少個站可以接收i(其實就是,對於每個i, k的個數,記作ai),然後將1<=i<=n,所有的a1 xor a2……xor an得到的值輸出
解題過程:
其實就是求出k的範圍(用i,radi,這些表示的不等式)
還有一個條件就是0<=rad(i+1)-rad(i)<=1 (題裏給出了)
首先,如果令j=i-1,那麼,對於i-radi+1<=k<=i-1可以滿足1.2.3
其次,那麼對於i-radi+1<=k<=i-2
Skj=k-j=k-(i-1)=k-i+1>=1
Sij=i-(i-1)=1
顯然對於這個範圍,可以滿足5
最後,對於i-radi+1<=k<=i-2
將j=i-1帶入條件4,即 i-rad(i-1)<=k<=i-2+rad(i-1)
通過 0<=rad(i+1)-rad(i)<=1 與i-radi+1<=k<=i-2 求交集得出i-radi+1<=k<=i-2 得到k的範圍
每個i對應的個數就是 (i-2)-(i-radi+1)+1=radi-2
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
for (int i=1;i<=t;i++)
{
printf("Case %d: ",i);
int n,x,res=0;
scanf("%d",&n);
for (int j=1;j<=n;j++)
{
scanf("%d",&x);
res^=max(0,x-2);//比0小的就不管,當0算
}
printf("%d\n",res);
}
return 0;
}