M.题目找规律,实际是DP,诈骗专场!!!!

题意:

将m个糖送给n个人,现在有s块糖,如果分给一个人a块糖,那么这个人获得好感度是a/s,问分完糖获得最大好感度是多少。

思路:

DP 三重循环

  • dp[i][j]表示给i个人分了j个仙贝,获得的好感度
    1. 第1种是二维dp[i][j],dp[i][j]=max(dp[i][j],dp[i-1][j-k]+k/(m-(j-k)))
      • dp[j]表示分了j个仙贝,获得的好感度
    2. 第二种是一维dp[j]=max(dp[j],d[j-k]+k/j)

      代码:

      • 二维:
        
        #include<bits/stdc++.h>
        using namespace std;
        double dp[505][505];
        int main() {
        int n,m,k;
        cin>>n>>m;
        for (int i = 1; i <=n ; ++i) {
        for (int j = 0; j <=m ; ++j) {
        for (int l = 0; l <=j ; ++l) {
            dp[i][j]=max(dp[i][j],dp[i-1][j-l]+1.0*l/(m-j+l));
        }
        }
        }
        printf("%.9f",dp[n][m]);

}

  • 一维:
    
    #include<bits/stdc++.h>
    using namespace std;
    double dp[505];
    int main() {
    int n,m,k;
    cin>>n>>m;
    double ans=0;
    for (int i = 1; i <=n ; ++i) {
        for (int j = m; j>=1 ; j--) {
            for (int l = 1; l <=j ; ++l) {
                dp[j]=max(dp[j],dp[j-l]+(1.0*l)/j);
                    ans=max(ans,dp[j]);
            }
        }
    }
    printf("%.9f",ans);

}


# [E.公平守望的灯塔](https://ac.nowcoder.com/acm/contest/46811/E)
## 题意:
**给A点(xa,ya)B点(xb,yb)2个点作以AB为斜边的等腰直角三角形ABC,如果C点坐标为整型,输出,否则,NO;**
## 思路:
**使用向量,AB中点为M,如果AM是(x,y),则MC为(y,-x)或(-y,x)**
## 代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll xa,ya,xb,yb,xc,yc,xm,ym;
ll x,y;
int main(){
    cin>>xa>>ya>>xb>>yb;
    xa*=2,ya*=2,xb*=2,yb*=2;
    xm=(xa+xb)/2ll,ym=(ya+yb)/2ll;
    ll amx=xm-xa,amy=ym-ya;
    if((amy+xm)%2ll==0&&(ym-amx)%2ll==0){
        cout<<(amy+xm)/2ll<<' '<<(ym-amx)/2ll;
        return 0;
    }
    else if((xm-amy)%2ll==0&&(ym+amx)%2ll==0){
        cout<<(xm-amy)/2ll<<' '<<(ym+amx)/2ll;
        return 0;
    }
    else
        cout<<"No Answer!";

}

H.本题主要考察了DFS(诈骗)

题意:

如图

*大小为n的拼图,由n^2块拼图片段来组成,给出nn-1块的形状,如上图,这块为0210,每块拼图的价格为10,凹的-1,凸的+1,求未知的那块拼图的形状。**

思路:

刚开始以为dfs进行拼图的还原(较难,而且会t),后补题才晓得直接用价值就可求出。

代码:

#include <iostream>
using namespace std;
char c[100005];
int main(){
    int t;cin>>t;
    while(t--){
        int n,x=0,y=0;
        cin>>n;
        for(int i=0;i<n*n*4-4;i++){
            cin>>c[i];
            if(c[i]=='1')x++;
            if(c[i]=='2')y++;
        }
        cout<<10+x-y<<endl;
    }
}

E.公平守望的灯塔

题意:

给A点(xa,ya)B点(xb,yb)2个点作以AB为斜边的等腰直角三角形ABC,如果C点坐标为整型,输出,否则,NO;

思路:

使用向量,AB中点为M,如果AM是(x,y),则MC为(y,-x)或(-y,x)

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll xa,ya,xb,yb,xc,yc,xm,ym;
ll x,y;
int main(){
    cin>>xa>>ya>>xb>>yb;
    xa*=2,ya*=2,xb*=2,yb*=2;
    xm=(xa+xb)/2ll,ym=(ya+yb)/2ll;
    ll amx=xm-xa,amy=ym-ya;
    if((amy+xm)%2ll==0&&(ym-amx)%2ll==0){
        cout<<(amy+xm)/2ll<<' '<<(ym-amx)/2ll;
        return 0;
    }
    else if((xm-amy)%2ll==0&&(ym+amx)%2ll==0){
        cout<<(xm-amy)/2ll<<' '<<(ym+amx)/2ll;
        return 0;
    }
    else
        cout<<"No Answer!";

}
posted on 2023-01-17 17:23  IR101  阅读(10)  评论(0编辑  收藏  举报  来源