校內團隊訓練賽2

2022-05-10 22:58:36 字數 2505 閱讀 1446

總結:太慘了,卡水題卡兩小時,直接飛了。

題目如下:

[傳送門]:

題意:給n表示陣列長度,m個關係,每個關係兩個索引,表示這兩個索引之間的值必須滿足大於或小於關係。然後構造兩個陣列,第乙個陣列是1到n的排列,第二個陣列至少有一對數值相等,兩個陣列都要滿足所有關係,能構造輸出方案,不能輸出no。

分析:主要還是不太會這種,題目的要求有點抽象,感覺情況挺多的很多種答案,當時就想bfs貪心,利用關係建圖,然後讓深度為偶數的盡量從1開始往上取,為奇數的從n開始往下取,因為感覺這樣不會導致出現連環關係,比如a>b,b>c的話,那a一定大於c,那第二個陣列就不能讓a和c相等了,所以想盡量一大一小的構造,然後有挺多bug的,如a,b,c間兩兩存在關係,即使構造成小大小,那a和c間的關係還是定下來了,因為是bfs賦值給c的,所以c會大於a,但是在bfs的過程中,vis[a]已經點亮了,所以不會再從c走回a,原本不能相等的a和c被我判可以相等了,然後改了好幾次還是有bug,根本就不是圖論題。

題解:任選兩個沒得關係的數變成一樣的n,其他數從小到大賦值成1到n-2,我人傻了,給大一沒學過bfs的我,這題估計10多分鐘就能想出來,那天比賽卡了我2個鐘頭。後來想了下確實很合理,其他數什麼關係不用管,先完成至少一組數相等的任務,把沒有關係的數變成最大其他數就從小到大,a陣列從小到大,b陣列也是那關係肯定都是一致的。

**:

#include#includeusing namespace std;

#define ll long long

ll n,m,u,v,ans[100007];

map,ll>ma;

int main()]=1;

ma=1;

}for(int i=1;i<=n;i++)]==0)

if(ok==1)break;

}if(ok==1)break;

}if(ok==0)printf("no\n");

else

}int lin=0;

for(int i=1;i<=n;i++)

else printf("%lld ",ans[i]);

}printf("\n");

for(int i=1;i<=n;i++)

printf("\n");

}}

[傳送門]:

題意:輸入t,n,a,b,k。t表示總人數,n表示天數,a表示奇數天最多多少人上課,b表示偶數天多少人上課,k表示乙個人至少上k節課及格,求最多多少人及格。

題解:後面沒什麼時間想了,被水題卡的大腦短路,關鍵這題要想到的是上課的最優策略,因為有限制,每人最多一天只能上一節課,如果一批人先把前幾天所有課搶了上滿以後,可能會導致後面天數不夠,空有教室座位而沒有天數了,那麼,一天要怎麼上最優。只要別讓一批人先上完前幾天的課就行了,讓他們乙個乙個上課,如果你想讓q個人及格,即沒有q人全上完第一節課,就不能讓上過第一節課的人去上第二節課,這樣可能會導致q個人全部掛科,但不重要,因為這說明,無法滿足讓q人全及格,而我只要找到符合要求的最大的q就行了,很明顯的二分。

**:

#include#include#include#includeusing namespace std;

#define ll long long

ll t,n,a,b,k,ans;

ll ok(ll m)

else}

int main()

else

}printf("%lld\n",ans);

}

[傳送門]:

題意:求出最小的a[i]*a[j]滿足i題解:題目比較特殊,一般都是對1e9+7取模,這個是對2^32取模,從學長得知,unsigned int 可以自動膜2^32,不用這個的話兩個這麼大的數相乘會爆long long int,然後算出a陣列後,可以從前往後貪心記錄最小值並,用當前位置以前的最小值和當前的數相乘,更新答案,但是有個bug,如-3,-2,-1最優值應該是-2,但這樣貪心的答案變成-3了,原理是因為負負得正,這裡我們想到再從後往前的走一邊,相反我們記錄最大值,hack資料就通過了。

#include#includeusing namespace std;

#define ll long long

static ll maxn=5e18+7;

ll t,n,l,r;

unsigned int b[10000007],x,y,z;

ll a[10000007],minn,ans;

int main()

ans=maxn;

minn=maxn;

for(int i=1;i<=n;i++)

else

}minn=-maxn;

for(int i=n;i>=1;i--)

map,vector>::reverse_iterator iter;

printf("%d\n",ma.size());

for(iter = ma.rbegin(); iter != ma.rend(); iter++)

printf("\n");

}}

校內團隊訓練賽

總結 菜。傳送門題意 擲骰子,給長度為n的陣列指點數,每個被擲中概率為1 n,m個特殊骰子,擲中還能擲一次,求期望。題解 水題,算出不能多擲的期望,與多擲一次的概率,聯立方程直接算出ans既可。includeusing namespace std int n,m,lin,ok 1007 ok2 do...

訓練 9 13 訓練賽

a.hdu 6230 乙個合法的子串 s 3n 2 滿足條件即1 2n 1 為以n為回文中心的回文串,n 3n 2為以2n 1為中心的回文串。故我們可以通過尋找回文中心對,來判斷相應合法子串的個數。利用manacher求出每個位置的最長回文半徑,則若i,j滿足條件 i j 則應有 p i geqsl...

訓練賽 詠歎

安師大附中訓練題目 給定乙個1到n的排列a,對其進行氣泡排序 counter 0 while a不是公升序的 counter counter 1 for i 1 to n 1 if a i a i 1 then swap a i a i 1 endifend forend while那麼經過幾輪排序...