20190731杭電多校第四場

2021-09-25 18:51:19 字數 2789 閱讀 5685

貪心。

對於每個數,找二進位制形式下末尾連續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 一開始推理的時候思路很清晰,但是接著就腦殘了,沒怎麼細想就直接去套樣例。以為得到了正確的解法,只是需要乙個特判。然...