M.题目找规律,实际是DP,诈骗专场!!!!
题意:
将m个糖送给n个人,现在有s块糖,如果分给一个人a块糖,那么这个人获得好感度是a/s,问分完糖获得最大好感度是多少。
思路:
DP 三重循环
- dp[i][j]表示给i个人分了j个仙贝,获得的好感度
- 第1种是二维dp[i][j],dp[i][j]=max(dp[i][j],dp[i-1][j-k]+k/(m-(j-k)))
- dp[j]表示分了j个仙贝,获得的好感度
- 第二种是一维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]);
- 二维:
- 第1种是二维dp[i][j],dp[i][j]=max(dp[i][j],dp[i-1][j-k]+k/(m-(j-k)))
}
- 一维:
#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!";
}