杭州電子科技大學計算機學院Debug杯程式設計競賽

2022-08-22 05:30:13 字數 3762 閱讀 7924

難得ak了,來寫一波題解

(感覺會是很長的題解qaq)

用若干"zsbd"來補全原串使得其大於等於指定長度

暴力模擬,手速題

#include#include#include#include#define max(a,b) (((a)>(b))?(a):(b))

#define min(a,b) (((a)<(b))?(a):(b))

#define ll long long

#define inf ~(1<<31)

#define def 100010

using namespace std;

int main()

minn=inf;

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

for(j=1;j有很多手牌,一些牌有價值,一些牌沒有,有價值的牌只有身處手牌邊緣時打出才有價值,每次可以花費\(w_i\)打掉第\(i\)張牌,問在花費不超過\(m\)的情況下能得到的最大價值

顯然,每次都從邊緣出牌獲得的價值才可能最大

因為邊緣出牌的牌必定是兩段連續的區間,一段從頭開始,一段從尾開始,那麼剩下的沒出的牌肯定是乙個連續的區間

於是我們可以用乙個滑動區間來模擬未出牌的區間,每次保證在區間外花費不超過\(m\)的情況下,區間最短就好了

從頭到尾迴圈一次,複雜度\(o(n)\)

#include#include#include#include#define max(a,b) (((a)>(b))?(a):(b))

#define min(a,b) (((a)<(b))?(a):(b))

#define ll long long

#define inf ~(1<<31)

#define def 200010

using namespace std;

long a[def],b[def];

int main()

all_sum=sum;

all_val=val;

m=all_sum-m;

ans=sum=val=0;

for(l=r=1;r<=n;r++)

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

}return 0;

}

定義數列的魅力值為\(\sum^_|a_-a_|\),允許對數列的連續的一部分進行反轉操作,即讓選定區間內的所有數前後順序顛倒,求可能得到的最大魅力值

對於乙個反轉操作區間\([l,r]\),很容易證明\([l+1,r-1]\)這個區間內的魅力值是不變的

那麼問題變成了\(a_l, a_, a_r, a_\)這四個數之間的關係了

對兩對單點魅力值列出算式:

令\(i=l-1, j=r\)

改變前:\(ans1=|a_i-a_}|+|a_j-a_|\)

改變後:\(ans2=|a_i-a_j|+|a_-a_|\)

那麼要求的就是\(ans2-ans1\)的最大值

\(ans2-ans1=|a_i-a_j|+|a_-a_|-|a_i-a_}|-|a_j-a_|\)

給\(a\)排個序,可以去掉第乙個絕對值,整理一下

原式\(=a_i-|a_i-a_|+|a_-a_|-a_j-|a_j-a_|\)

因為\(a_i\)和\(a_\)以及\(a_j\)和\(a_\)的關係飄忽不定

所以列舉\(a_\)和\(a_\)的大小關係

1)\(a_ > a_\)

原式\(=(a_i+a_-|a_i-a_|)-(a_j+a_+|a_j-a_|)\)

\(=2*min(a_i, a_)-2*max(a_j,a_)\)

2)\(a_ \leq a_\)

原式\(=(a_i-a_-|a_i-a_|)-(a_j-a_+|a_j-a_|)\)

分情況列舉一下,可知\((a_i-a_-|a_i-a_|) \leq 0\)且\((a_j-a_+|a_j-a_|) \geq 0\)

那麼這種情況一定為負

綜上所述,要找的就是\(2*min(a_i, a_)-2*max(a_j,a_)\)

那麼既然\(i且\(a_i>a_j\),就直接從大到小排個序,然後從後往前列舉一遍,維護一下i之後的\(max(a_j,a_)\)就好了

#include#include#include#include#define max(a,b) (((a)>(b))?(a):(b))

#define min(a,b) (((a)<(b))?(a):(b))

#define ll long long

#define inf ~(1<<31)

#define def 500010

using namespace std;

struct nodea[def],b[def];

int main()

memcpy(b,a,sizeof(a));

sort(a+1,a+n+1,[&](node a,node b));

ans=0;

minn=inf;

maxx=0;

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

if(a[i].y在不同的距離上有很多堆東西,每次可以按照輸入順序拿走\(m\)個,如果拿滿了就回到起點(距離為0的點),問拿走所有東西的需要的距離是多少

看起來像乙個\(dp\)或者貪心,其實認真讀題會發現,順序是固定的

那麼這題就是乙個模擬了

需要注意的是,每個點可能不止來回一次(在這wa了幾發)

#include#include#include#include#define max(a,b) (((a)>(b))?(a):(b))

#define min(a,b) (((a)<(b))?(a):(b))

#define ll long long

#define inf ~(1<<31)

#define def 100010

using namespace std;

ll a[def],b[def];

int main()

a[now]=max(0,a[now]-b[now]);

}int main()

} return 0;

}

考試每題亂選答案,但是答案填錯了,填到了下一題的位置,每題有\(a_i\)個選項,問得分期望

3種情況,分情況暴力列舉

1)\(a_i

得分概率\(=\frac*\frac}\)

2)\(a_i=a_\)

得分概率\(=\frac\)

3)\(a_i>a_\)

得分概率\(=\frac}*\frac}\)

#include#include#include#include#define max(a,b) (((a)>(b))?(a):(b))

#define min(a,b) (((a)<(b))?(a):(b))

#define ll long long

#define inf ~(1<<31)

#define def 100010

using namespace std;

double a[def];

int main()

if(s[0]>'9')

return s;

}int main()

{ long _=1,__=1,i;

ll maxx=1,n;

string s;

for(((1)?scanf("%ld",&_):eof);_;_--,__++){

cin>>s;

cout《呼~(長呼一口氣)

又到了摸魚的時間了呢

杭州電子科技大學ACM 1081

input input consists of several lines of integer numbers.the first line contains an integer n,which is the number of cases to be tested,followed by n ...

杭州電子科技大學acm 2010

problem description 春天是鮮花的季節,水仙花就是其中最迷人的代表,數學上有個水仙花數,他是這樣定義的 水仙花數 是指乙個三位數,它的各位數字的立方和等於其本身,比如 153 1 3 5 3 3 3。現在要求輸出所有在m和n範圍內的水仙花數。input 輸入資料有多組,每組佔一行,...

杭州電子科技大學acm 2005

input 輸入資料有多組,每組佔一行,資料格式為yyyy mm dd組成,具體參見sample input 另外,可以向你確保所有的輸入資料是合法的。output 對於每組輸入資料,輸出一行,表示該日期是該年的第幾天。define crt secure no warnings include in...