B:Buggy Robot
【题意】
一个n*m的地图(1≤n, m≤50),有一个入口和一个出口。给定一个命令序列(上,下,左,右),如果碰到障碍或者边际就忽略。问至少加入或删除多少个的命令,使得能从入口走到出口。
【题解】
f[i][j][k]表示在位置(i,j),匹配到命令序列的第k项,至少加入或删除多少个的命令。
D:Contest Strategy
【题意】
一场ACM有n题,做第i题要$t_i$的时间。
有n!种读题顺序,做题策略是这样的:
1.先随机读k道题;
2.在读过的题中做用时最少的题(有多个就随便选一个)
3.从没读过的题中随机选一题(如果有的话)
4.如果还有题没有做,跳到步骤2
求n!种情况的罚时之和。
【题解】
这道题可以做到O(n)(不算排序)
容易知道第i个做出来的题系数为n-i+1
容易知道最后做出来的k-1道题一定是用时前k-1大的。
我们从后往前考虑。
先把时间从大到小排序。
改一下规则,如果在读过的题中有多个用时最少,选下标最大的。
记f[i]表示只考虑前i道题时的答案。
f[1]=t[1]
当1<i<=k时,
$f[i]=f[i-1]*i+i!*t[i]*i$
当k<i<=n时,
这道题如果一旦被读过,就一定会立刻做。
我们要算这道题的贡献和它造成其他题罚时的增量。
分两种情况考虑,
1)这道题是第1道做出来的题
2)这道题是第2...i-k+1道做出来的题目
看程序注释
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cassert> 4 #include<iostream> 5 #include<fstream> 6 #include<algorithm> 7 #include<cstring> 8 #include<string> 9 #include<cmath> 10 #include<queue> 11 #include<stack> 12 #include<map> 13 #include<utility> 14 #include<set> 15 #include<bitset> 16 #include<vector> 17 #include<functional> 18 #include<deque> 19 #include<cctype> 20 #include<climits> 21 #include<complex> 22 #include<bits/stdc++.h> 23 #include<ctime> 24 25 using namespace std; 26 27 typedef long long LL; 28 typedef double DB; 29 typedef pair<int,int> PII; 30 typedef pair<DB,DB> PDD; 31 typedef complex<DB> CP; 32 typedef vector<int> VI; 33 34 #define mmst(a,v) memset(a,v,sizeof(a)) 35 #define mmcy(a,b) memcpy(a,b,sizeof(a)) 36 #define fill(a,l,r,v) fill(a+l,a+r+1,v) 37 #define re(i,a,b) for(i=(a);i<=(b);i++) 38 #define red(i,a,b) for(i=(a);i>=(b);i--) 39 #define fi first 40 #define se second 41 #define mp(a,b) make_pair(a,b) 42 #define pb(a) push_back(a) 43 #define two(k) (1<<(k)) 44 #define SZ(x) (int(x.size())) 45 #define all(x) (x).begin(),(x).end() 46 #define ire(i,v,x) for(i=0,v=i<SZ(x)?x[i]:0;i<SZ(x);v=x[++i]) 47 #define ls (rt<<1) 48 #define rs (rt<<1|1) 49 #define MID ((l+r)>>1) 50 51 template<class T>inline T sqr(T x){return x*x;} 52 template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;} 53 template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} 54 55 inline int sgn(DB x){if(fabs(x)<1e-9)return 0;return(x>0)?1:-1;} 56 const DB Pi=acos(-1.0); 57 58 int gint() 59 { 60 int res=0;bool neg=0;char z; 61 for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar()); 62 if(z==EOF)return 0; 63 if(z=='-'){neg=1;z=getchar();} 64 for(;z!=EOF && isdigit(z);res=(res<<3)+(res<<1)+z-'0',z=getchar()); 65 return (neg)?-res:res; 66 } 67 LL gll() 68 { 69 LL res=0;bool neg=0;char z; 70 for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar()); 71 if(z==EOF)return 0; 72 if(z=='-'){neg=1;z=getchar();} 73 for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar()); 74 return (neg)?-res:res; 75 } 76 77 const int maxn=310; 78 const int MOD=1000000007; 79 80 int n,k; 81 LL t[maxn],s[maxn],fact[maxn],f[maxn]; 82 83 bool cmp(LL a,LL b){return a>b;} 84 85 int main() 86 { 87 freopen("D.in","r",stdin); 88 int i; 89 n=gint();k=gint(); 90 re(i,1,n)t[i]=gint(); 91 sort(t+1,t+n+1,cmp); 92 re(i,1,n)s[i]=(s[i-1]+t[i])%MOD; 93 fact[0]=1;re(i,1,n)fact[i]=fact[i-1]*i%MOD; 94 LL temp=0; 95 re(i,1,k-1)(temp+=t[i]*i)%=MOD; 96 f[1]=t[1]; 97 re(i,2,k)f[i]=(f[i-1]*i%MOD+fact[i]*t[i]%MOD*i%MOD)%MOD; 98 re(i,k+1,n) 99 { 100 f[i]=f[i-1]*i%MOD; 101 (f[i]+=fact[i-1]*k%MOD*t[i]%MOD*i%MOD)%=MOD;//这道题是第1道做出来的题 102 //这道题是第2...i-k+1道做出来的题目 103 (f[i]+=fact[i-1]*(i-1+k)*(i-k)/2%MOD*t[i]%MOD)%=MOD;//这道题的贡献 104 (f[i]+=f[i-1]-(temp+(s[i-1]-s[k-1])*(k-1))*fact[i-1]%MOD)%=MOD;//它造成其他题罚时的增量 105 } 106 cout<<(f[n]%MOD+MOD)%MOD<<endl; 107 return 0; 108 }