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;
}
posted @ 2024-09-13 15:20  冬天的睡袋  阅读(6)  评论(0编辑  收藏  举报