AtCoder Beginner Contest 194題解
阿新 • • 發佈:2021-08-04
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\)
如果\(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;
}