牛客小白月赛92_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ
D
:数学问题简化复杂度
整理成一个关于位置x的一元二次函数,计算系数后,从1到n逐一尝试,时间复杂度O(n)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
priority_queue<int,vector<int>,greater<int>>qmi;//大根堆
priority_queue<int>qma;//小根堆
const int mod = 1e09+7;
int gcd(int a,int b)
{
return b>0?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
bool cmp(char a,char b)
{
return a>b;
}
void solve(){
int n;
cin>>n;
vector<int>a(n+1);
int sum1=0,sum2=0,sum0=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum0+=a[i];
sum1+=i*a[i];
sum2+=i*i*a[i];
}
int min1=inf;
for(int x=1;x<=n;x++)
{
int sum=x*x*sum0-2*x*sum1+sum2;
min1=min(sum,min1);
}
cout<<min1<<endl;
}
signed main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int t=1;
// cin>>t;
while(t--) {
solve();
}
return 0;
}
E
:dp动态规划
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
//#define inf 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define pii pair<int,int>
priority_queue<int,vector<int>,greater<int>>qmi;//大根堆
priority_queue<int>qma;//小根堆
const int mod = 1e09+7;
int gcd(int a,int b)
{
return b>0?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
return a/gcd(a,b)*b;
}
bool cmp(char a,char b)
{
return a>b;
}
struct mei{
int x,y;
};
int f[1000006][2];
/*
本题的f[i][j]表示融化i单位的铁矿石,是否已经使用了暗物质(j=0表示没有使用,j=1表示已经或者本次使用)
1.01背包的思路,再一维优化的基础上i,二维上就是是否使用暗物质j
2.本题有一个坑,至多融化x单位的铁矿石,所以j要从m遍历到0,然后对f[i][max(0ll,j-v[i])]取一个max,
*/
void solve(){
int n,m;
cin>>n>>m;//煤炭,铁矿石
vector<mei>a(n+1);
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
memset(f,inf,sizeof(f));//融化i单位的铁矿石最少使用的时间。
f[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
//由于至多x单位的铁矿石,所以a[i].x可能大于m,这也是合法的答案,可以计入f[0][0gtt]
//还没有使用暗物质所以f[j][0],就正常转移
f[j][0]=min(f[j][0],f[max(0ll,j-a[i].x)][0]+a[i].y);
//已经使用过暗物质了所以f[j][1]
f[j][1]=min(f[j][1],f[max(0ll,j-a[i].x)][1]+a[i].y);
//还没有使用过暗物质,对于第i个煤炭使用暗物质
f[j][1]=min(f[j][1],f[max(0ll,j-2*a[i].x)][0]+a[i].y/2);
}
}
cout<<min(f[m][0],f[m][1])<<endl;
}
signed main() {
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int t=1;
// cin>>t;
while(t--) {
solve();
}
return 0;
}