1. 程式人生 > 其它 >vue專案開發引導頁-帶有動畫效果

vue專案開發引導頁-帶有動畫效果

技術標籤:# 寒假學習

20210106

20210106 cf+3Codeforces Round #694 (Div. 2) d題今天還是沒開出來,看了題解沒搞懂

A. Strange Partitionhttps://codeforces.com/contest/1471/problem/A

題意:有一個長為n的陣列a,和一個數x,陣列a的美麗值=\sum_{i=1}^{k}\left \lceil \frac{ai}{x} \right \rceil。對於陣列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個\frac{ai}{x},從a1開始遍歷進行操作一直進行到ai不是x的倍數為止,要求最終陣列a的所有值的和。

思路:我們可以求出ai能夠延伸出m個\frac{ai}{x},同時找出這n個數中最小的m以及最小的m處在第j個,而加入x個\frac{ai}{x},則是給陣列增加了一個ai。故,最後的和的公式為\left ( m+1 \right )\sum_{i=1}^{n}ai+\sum_{i=1}^{j}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;
}