貪心。
對於每個數,找二進位制形式下末尾連續1的數量,若為i,則可連到數字2^(i-1),若2^(i-1)不存在,則連到1最優。
ac**:
using namespace std;
#includeint t,n,i,x;
int a[200001];
long long sum,ans;
int main()
}if (sum>n)
a[i]=1;
else
a[i]=sum;
}ans=0;
for (i=2;i<=n;i++)
ans+=a[i]&i;
printf("%lld\n",ans);
for (i=2;i<=n;i++)
if (i!=n)
printf("%d ",a[i]);
else
printf("%d\n",a[i]);
}return 0;
}
題面很坑的少了n/k,導致最後才知道還得保證每組是n/k個石頭。
顯然無解的情況:
1、2、n==k且n!=1。
因為要分成k組,每組n/k個石頭。
將n個石頭等分為n/k個區間,每個區間都是連續k個值。
若n/k為偶數,則可每兩個區間湊在一起,保持k組的差值始終為0即可。
若n/k為奇數,則k必為奇數,否則就會是顯然無解的情況1。(n/k-3)是偶數,先兩兩之間就可以湊出為0的情況即可。然後考慮用剩下三個區間湊出相等的k組。
三個區間湊的情況可以試試資料15 5
然後就可以發現一種簡單的構造方法,第一列從大到小,第二列按間隔為2的形式從小往大取(其實就是分奇偶),這樣可以保證最後一列要取的數字不會重複,最後一列直接用單組區間和減去已經取了的區間和即可。
ac**:
using namespace std;
#includeint t,x,i,j;
long long n,k;
vectora[100001];
long long sum[100005];
int main()
if ((n*(n+1)/2)%k!=0 || n==k)
printf("yes\n");
for (i=1;i<=k;i++)
a[i].clear();
x=n/k;
if (x%2==0)
}else
//最後三列
for(int i=1;i<=k;i++) sum[i]=0;
for(int j=1;j<=k;j++) a[j].push_back((x-3)*k+k-j+1);
for(int j=1,z=(x-2)*k+1;z<=(x-1)*k;j++,z+=2) a[j].push_back(z);
for(int j=k/2+2,z=(x-2)*k+2;j<=k;j++,z+=2) a[j].push_back(z);
for(int i=0;i<=x-2;i++) for(int j=1;j<=k;j++) sum[j]+=a[j][i];
for(int j=1;j<=k;j++)
} for (i=1;i<=k;i++)
^}*p_^}*...*p_^}" class="mathcode" src=""/>和未分解部分m,令
現在只需要考慮m。首先可以知道,m的最小素因子大於4000,則可知m不為1的情況可能為
先判m是否可表示為x^2
如果可以,再看x是否可表示為y^2,若可以,則ans1=4;否則ans1=2。
如果不可以,看x是否可表示為x^3,若可以,則ans1=3;否則ans1=1。
最後得到答案min(ans0,ans1)。
ac**:
#includeusing namespace std;
#define ll long long
#define db double
#define m_p make_pair
#define p_b push_back
#define for(i,a,b) for(int i=a;i<=b;i++)
#define ls (rt<<1)
#define rs ((rt<<1)|1)
#define mst(a,b) memset(a,b,sizeof(a))
const int maxn=4e3+5;
const db eps=1e-8;
const ll inf=1e18;
const int mod=1e9+7;
const int seed=131;
int t;
ll x;
int prime[maxn],tot;
bool notprime[maxn];
void init()
}}int p[100],e[100],pcnt;
int main()
ans=min(e[pcnt],ans);
pcnt++;}}
if(x==1||ans==1)
int m=sqrt(x+0.5);
if(m*1ll*m==x)
else
}if(ans1!=3) ans1=1;
}ans=min(ans,ans1);
cout<
}return 0;
}
杭電多校第四場1002
給定n種 每種 有傷害值和冷卻時間。a,b兩人需要在遊戲開始前選擇一種 一直使用直至遊戲結束。a可以自行挑選,b隨機選擇。a,b初始都有100hp 兩人中任意一人死亡遊戲結束,如果同時死亡則各有一半的勝率。問 在最優選擇下,a的獲勝期望是多少?預處理出所有 擊殺對方需要的時間。a選擇其中一種,那麼b...
2023年杭電暑期多校(第四場)
題意 給定乙個4 4的矩陣,按照8數碼一樣的移動方式,問能否在120步內移動到目標狀態。思路 雖然我不知道怎麼證明,反正如果兩個狀態能夠互相到達,那麼所需步數最多只需要46步。那麼只需要求兩個狀態能否互相到達就好了。n m的數碼問題有乙個結論 1.假如m是奇數,那麼上下交換會改變 m 1 也就是偶數...
2013第四場多校
多校第四場 6題,打得最好的一場多校。還是cjboy給力。本場比賽我基本上沒什麼貢獻,搞04一搞就是一下午。最後看了09覺得只有狀態壓縮,不知道怎麼優化。1004 圖論,強聯通分量 0 一開始推理的時候思路很清晰,但是接著就腦殘了,沒怎麼細想就直接去套樣例。以為得到了正確的解法,只是需要乙個特判。然...