1. 程式人生 > 其它 >AtCoder Beginner Contest 194題解

AtCoder Beginner Contest 194題解

I Scream

題目大意

輸入兩個數\(N\)\(M\)

然後:

1、如果\(N+M\ge 15\)並且\(M\ge 8\),輸出\(1\)

2、如果\(N+M\ge 10\)並且\(M\ge 3\),輸出\(2\)

3、如果\(N+M\ge 3\),輸出\(3\)

4、否則輸出\(4\)

題解

\(if\)判斷即可,非常簡單

程式碼

#include<bits/stdc++.h>
using namespace std;
int main() 
{
    int n,m;
    cin>>n>>m;
    if(n+m>=15&&m>=8)
    puts("1");
    else
    {
    	if(n+m>=10&&m>=3)
        puts("2");
        else
        {
        	if(n+m>=3)
            puts("3");
            else
            puts("4");
		}
	}
	return 0;
}

Job Assignment

題目大意

有兩個工作\(A\)\(B\)\(n\)個人,第\(i\)個人做工作\(A\)的時間是\(a_i\),第\(i\)個人做工作\(B\)的時間是\(b_i\)

可以選擇\(1\)\(2\)個人完成工作,如果是\(1\)個人,時間為\(a_i+b_i\),如果是\(2\)個人,時間為\(max(a_i,b_j)\)

要求你求出完成兩個工作的最小值。

題解

因為\(1\le n\le 1000\),所以我們可以用兩個迴圈\(O(n^2)\)的時間,第一個迴圈列舉工作\(A\)由誰做,第二個迴圈列舉工作\(B\)由誰做。

\(ans\)表示答案,則:

如果\(i=j\)

\(ans=min(ans,a_i+b_j)\)

如果\(i\not =j\)\(ans=min(ans,max(a_i,b_j))\)

\(ans\)的初值是\(INF\)

程式碼

#include<bits/stdc++.h>
using namespace std;
int a[1001],b[1001];
int main() 
{
    int n,ans=INT_MAX;
    cin>>n;
    for(int i=1;i<=n;i++)
    	cin>>a[i]>>b[i];
	for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=n;j++)
        {
        	if(i==j)
        	ans=min(ans,a[i]+b[j]);
        	else
        	ans=min(ans,max(a[i],b[j]));
	    }
	}
	cout<<ans;
	return 0;
}

Squared Error

題目大意

\(\large \displaystyle\sum_{i=2}^n\displaystyle\sum_{j=1}^{i-1}(A_i-A_j)^2\)的值。

題解

\[\displaystyle\sum_{i=2}^n\displaystyle\sum_{j=1}^{i-1}(A_i-A_j)^2=\displaystyle\sum_{i=2}^n\displaystyle\sum_{j=1}^{i-1}(A_i^2+A_j^2-2A_iA_j)= \]\[\displaystyle\sum_{i=2}^n\displaystyle(A_i^2(i-1)+sum1[1,i-1]-2A_isum2[1,i-1]) \]

其中\(sum1\)代表\(A_j^2\)的字首和。

其中\(sum2\)代表\(A_j\)的字首和。

時間複雜度為\(O(n)\)

程式碼

#include<bits/stdc++.h>
using namespace std;
long long sum1[300001],sum2[300001],a[300001],ans;
int main() 
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
    	sum1[i]=sum1[i-1]+a[i]*a[i];
    	sum2[i]=sum2[i-1]+a[i];
	}
    for(int i=2;i<=n;i++)
    {
    	ans+=a[i]*a[i]*(i-1)+sum1[i-1]-2*a[i]*sum2[i-1];
	}
	cout<<ans;
	return 0;
}