A - Red and Blue Beans
题目链接
题意:给你一袋有
n
n
n个红豆一袋
m
m
m个蓝豆问你能不能分为好几袋
a
b
s
(
n
−
m
)
<
=
k
abs(n-m)<=k
abs(n−m)<=k
所以就是判断最大程度分能不能达到 < = k <=k <=k
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000005;
ll t, r, b, d, q, n, m;
int main(){
cin>>t;
while(t--) {
cin>>r>>b>>d;
q=0;
if(d==0) {
if(r!=b) q=1;
}else {
n=max(r, b);
m=min(r, b);
if(n%m==0) n/=m;//比赛写成了(n+1)/m应该是(n+m-1)/m向上取整突然不会整了
else n=n/m+1;
if(n-1>d)q=1;
}
if(q) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
B - The Cake Is a Lie
题目链接
题意:向下走消耗
y
y
y能量,向右走消耗
x
x
x能量
多画几张图就能知道答案是
n
∗
m
−
1
n*m-1
n∗m−1
或者验证发现怎么走消耗都是一样的 所以答案就是
n
+
n
∗
(
m
−
1
)
−
1
n+n*(m-1)-1
n+n∗(m−1)−1;
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000005;
ll t, r, a, b, d, q, n, m, k, ans;
int main(){
cin>>t;
while(t--) {
cin>>m>>n>>k;
if(k==n*m-1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C - Berland Regional
题目链接
题意:给你一堆学校和各个学校的各个成员的编程能力,然后各个学校要把他们的成员分成有
k
k
k个人的组,输出所有学校能这样分的组的能力总和
直接就暴力 反正当时很怕会WA 其实看着
n
2
n2
n2其实就是
n
l
o
g
n
nlogn
nlogn。。。
想很久就是不写
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 200005;
ll t, a[N], b[N], sum[N], n, m, k, ans[N], x;
vector<ll> v[N];
set<ll> se;
int main(){
cin>>t;
while(t--) {
cin>>n;
memset(sum,0,sizeof(sum));
memset(ans,0,sizeof(ans));
se.clear();
for(int i=1; i<=n; i++){
v[i].clear();
}
for(int i=1; i<=n; i++) {
cin>>a[i];
se.insert(a[i]);//存队伍
}
for(int i=1; i<=n; i++) {
cin>>x;
v[a[i]].push_back(x);//存成员
}
for(auto x:se){
sort(v[i].begin(), v[i].end(), greater<ll>());
m=v[i].size();
for(int j=1; j<=m; j++){
sum[j]=v[x][j-1]+sum[j-1];//前缀和这里想不到
}
for(int j=1; j<=m; j++){
ans[j]+=sum[m/j*j];
}
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<" \n"[i==n];
}
}
return 0;
}
D - Maximum Sum of Products
题目链接
题意:给你
n
n
n个
a
a
a数组和
b
b
b数组,你要翻转子序列使
a
i
∗
b
i
a{i}*bi
ai∗bi的总和最大
可以dp也可以模拟+前缀和
最后了题目都看错了以为是交换两个。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5005;
ll t, r, n, m, a[N], b[N], dp[N][N], sum, ans;
int main(){
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
for(int i=1; i<=n; i++) {
cin>>b[i];
sum+=a[i]*b[i];
}
for(int k=2; k<=n; k++) {
for(int i=1; i<=n-k+1; i++) {
int j=i+k-1;
dp[i][j]=dp[i+1][j-1]+(a[i]-a[j])*(b[j]-b[i]);
ans=max(ans, dp[i][j]);
}
}
//cout<<sum<<endl;
cout<<ans+sum<<endl;
return 0;
}