您的位置:首页 > 其它

Noip模拟题解题报告

2018-10-17 11:30 260 查看

Pro

题目链接

Sol

小 G 搭积木

一开始脑残想了一个正确的贪心策略,但没拿满。

正解:二分+贪心。

二分[1,n],mid之前的数放到一列,mid之后的数jud()函数判断能否放到mid列中。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int n , num[5005] , l , r;

bool cmp(int a , int b) { return a>b; }
inline int mymin(int a , int b) { return a<b?a:b; }

int jud(int x) {
int opt[5005];
for(int i=1; i<=x; i++)
opt[i] = num[i];
for(int i=x+1; i<=n; i++) {
int maxn = 0 , pot = 0;
for(int j=1; j<=x; j++) {
if(opt[j]>maxn) {
maxn = opt[j];
pot = j;
}
}
if(!pot)
return 0;
else
opt[pot] = mymin(opt[pot]-1 , num[i]);
}
return 1;
}

int main() {
freopen("box.in","r",stdin);
freopen("box.out","w",stdout);
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&num[i]);
sort(num+1 , num+n+1 , cmp);
l = 1 , r = n;
while(l<=r) {
int mid = (l+r)>>1;
if(jud(mid))
r = mid - 1;
else
l = mid + 1;
}
printf("%d",l);
return 0;
}

小 G 的城堡

emmm,算是结论题吧……

ans=kk−1×(n−k)n−kans=k^{k-1} × (n-k)^{n-k}ans=kk−1×(n−k)n−k

#include<iostream>
#include<cstdio>
#define mod 1000000007
using namespace std;

long long n , k;

inline long long mypow(long long a , long long b) {
long long t = 1;
a = a%mod;
while(b) {
if(b&1)
t = t*a%mod;
a = a*a%mod;
b>>=1;
}
return t;
}

int main() {
freopen("castle.in","r",stdin);
freopen("castle.out","w",stdout);
scanf("%lld%lld",&n,&k);
long long x = mypow(n-k,n-k)%mod;
printf("%lld",mypow(k,k-1)*mypow(n-k,n-k)%mod);
return 0;
}

跳跃

胡乱推了一个不正确的dp

打的70分记搜,上代码。

#include<iostream>
#include<cstdio>
using namespace std;

int n , d , f[10005][10005] , maxn , val[10005];
inline int mymax(int a , int b) { return a>b?a:b; }

int dfs(int u , int len) {
if(u>maxn)
return 0;
int t = 0;
t = mymax(t , f[u+len][len]?f[u+len][len]:f[u+len][len]=dfs(u+len,len));
t = mymax(t , f[u+len+1][len+1]?f[u+len+1][len+1]:f[u+len+1][len+1]=dfs(u+len+1,len+1));
if(len>1)
t = mymax(t , f[u+len-1][len-1]?f[u+len-1][len-1]:f[u+len-1][len-1]=dfs(u+len-1,len-1));
return f[u][len]=t+val[u];
}

int main() {
freopen("jump.in","r",stdin);
freopen("jump.out","w",stdout);
scanf("%d%d",&n,&d);
for(int i=1; i<=n; i++) {
int x;
scanf("%d",&x);
val[x]++;
maxn = mymax(maxn , x);
}
printf("%d",dfs(d , d));
return 0;
}
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: