dp+知道结果求在过程的思维
codeforces
C. Armchairs
dp题,写不出来,我们应该这么去考虑,一共有n个苹果要放在n个箱子里,要全部放完
使得苹果和箱子的总距离差值和最小,类似于背包,每个箱子放不放,放了确保最小的
箱子容量不用考虑一一对应的。
#include <bits/stdc++.h>
#define int long long
using namespace std;
int f[5001][5001];
int v[5001];
int32_t main( )
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for (int i = 0; i <=n ; ++i) {
for (int j = 0; j <=n ; ++j) {
f[i][j]=INT_MAX;
}
f[i][0]=0;
}
for (int i = 1; i <=n ; ++i) {
cin>>v[i];
}
int sum=0;
vector<int>p;
p.push_back(0);
for (int i = 1; i <=n ; ++i) {
if(v[i]==1){
p.push_back(i);
sum++;
}
}
for (int i = 1; i <=n; ++i) {
for (int j = 1; j <=sum ; ++j) {\
f[i][j]=f[i-1][j];
if(v[i]==1)continue;
f[i][j]=min(f[i-1][j],f[i-1][j-1]+abs(i-p[j]));
}
}
cout<<f[n][sum];
return 0;
}
A. Winner
字符串+思维
我想着取维护第一个的值,但是感觉思路有问题写不出来(因为后面的可能会减小会影响所有的map的前后关系)
看了别人的代码首先数据不超过1000,我们可以先找到最终的答案的值
如何我们从头再开始枚举一遍,如果满足当前枚举的值大于等于最终答案,并且最终答案是正确的
那么输出答案即可
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
string d[1002];
int v[1002];
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
map<string,int>mp;
for (int i = 1; i <=n ; ++i) {
cin>>d[i]>>v[i];
mp[d[i]]+=v[i];
}
int maxx=0;
map<string,int>cs;
for(auto it:mp){
maxx=max(maxx,it.second);
}
for(int i=1;i<=n;i++){
cs[d[i]]+=v[i];
if(cs[d[i]]>=maxx&&mp[d[i]]==maxx){
cout<<d[i];
break;
}
}
return 0;
}