vue專案開發引導頁-帶有動畫效果
技術標籤:# 寒假學習
20210106
20210106 cf+3Codeforces Round #694 (Div. 2) d題今天還是沒開出來,看了題解沒搞懂
A. Strange Partitionhttps://codeforces.com/contest/1471/problem/A
題意:有一個長為n的陣列a,和一個數x,陣列a的美麗值=。對於陣列a我們可以把兩個相鄰的元素合併到一起成兩個元素的和。我們要分別求這個陣列的最小和最大的美麗值。
思路:對於最大美麗值的情況:若ai是x的倍數則加或是不加對結果沒有影響,若ai不是x的倍數,則單獨求ai的美麗值會比讓ai與相鄰的相加再求的美麗值大,故對於最大值,則是單獨求每個元素的美麗值再相加。
對於最小美麗值的情況:若ai是x的倍數則加或是不加對結果沒有影響,若ai不是x的倍數,則讓ai與相鄰的非x的倍數的值相加再求的美麗值會比單獨求ai的美麗值小,但是隻能是相鄰的兩個元素相加,若是隻考慮讓相鄰的非x的倍數相加,而x的倍數不進行加和的話,還是會比最優值大,最優值是把a陣列求和再求美麗值。
int n,x; int a[100010]; int minn,maxn; int sum; void work() { n=read(); x=read(); sum=0;minn=0;maxn=0; for(int i=1;i<=n;i++) { a[i]=read(); if(a[i]%x==0) { sum+=a[i]; maxn+=a[i]/x; } else { sum+=a[i]; int xx=a[i]/x+1; maxn+=xx; } } if(sum%x==0)minn+=sum/x; else minn+=sum/x+1; prt(minn); printf(" "); prt(maxn); printf("\n"); return; }
B. Strange Listhttps://codeforces.com/contest/1471/problem/B
題意:有一個長為n的陣列a和一個數x,對於ai,如果ai是x的倍數,則在陣列的末尾加入x個,從a1開始遍歷進行操作一直進行到ai不是x的倍數為止,要求最終陣列a的所有值的和。
思路:我們可以求出ai能夠延伸出m個,同時找出這n個數中最小的m以及最小的m處在第j個,而加入x個,則是給陣列增加了一個ai。故,最後的和的公式為。
int n,x; int a[100010]; int ans; int minn,id; void work() { ans=0; n=read(); x=read(); minn=0; for(int i=1;i<=n;i++) { a[i]=read(); minn=max(minn,a[i]); ans+=a[i]; } for(int i=1;i<=n;i++) { int xx=a[i]; int cc=0; while(xx%x==0) { cc++; xx/=x; } if(minn>cc) { minn=cc; id=i; } } for(int i=1;i<=n;i++) { if(i<id) { ans+=a[i]*(minn+1); } else { ans+=a[i]*minn; } } prt(ans); printf("\n"); return; }
C. Strange Birthday Partyhttps://codeforces.com/contest/1471/problem/C
題意:有n個朋友和一個有m個禮品的禮品店,每個朋友心儀第ki的禮品,而m個禮品每個禮品的價格為ci(c陣列是按價格從小到大排列的)。每個禮品只能被買一次,但由於是你來買禮物,對於每個朋友,可以買第ki前的禮品,或是給第ki個禮品對應現金。
思路:我們可以求出若是給第i個朋友現金價格為wi,根據wi進行降序sort,用cnt記錄當前供選擇的禮物,對於第i個人,選擇wi和bcnt中小的那一個。
int n,m;
int a[300010],b[300010];
int w[300010];
int ans;
bool cmp(int a,int b)
{
return a>b;
}
void work()
{
ans=0;
n=read();
m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=m;i++)b[i]=read();
for(int i=1;i<=n;i++)w[i]=b[a[i]];
sort(w+1,w+1+n,cmp);
int cnt=1;
for(int i=1;i<=n;i++)
{
if(w[i]>b[cnt]&&cnt<=m)
{
ans+=b[cnt];
cnt++;
}
else ans+=w[i];
}
prt(ans);
printf("\n");
return;
}