problem ——4133
思路:组合数,mod k即可…
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long
#define db double
#define INF 0x7fffffff
#define N 2005
#define M 20
int T,n,m,k;
int C[N][N],f[N][N];
int main(){
// freopen("problem.in","r",stdin);
// freopen("problem.out","w",stdout);
cin>>T>>k;
REP(i,0,N-5){
C[i][0]=1;
REP(j,1,i){
C[i][j]=C[i-1][j]+C[i-1][j-1];
if(C[i][j]>=k)C[i][j]-=k;
f[i][j]=f[i][j-1]+!C[i][j];
}
}
while(T--){
scanf("%d%d",&n,&m);
int ans=0;
REP(i,0,n)ans+=f[i][min(i,m)];
printf("%d\n",ans);
}
return 0;
}
earthworm ——4134
思路:贪心…将3个队列来存切的蚯蚓,左儿子蚯蚓,右儿子蚯蚓… md水题呀!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long
#define db double
#define INF 0x3f3f3f3f
#define N 100005
int n,m,q,u,v,t;
db p;
int A[N],B[N];
int cmp(int a,int b){return a>b;}
struct p3{
int Q[4][N*100];
int l[4],r[4],add;
int get(){
int a=-INF,b=-INF,c=-INF,ans=1;
if (l[1]<r[1]) a=Q[1][l[1]];
if (l[2]<r[2]) b=Q[2][l[2]];
if (l[3]<r[3]) c=Q[3][l[3]];
if (a<b) a=b,ans=2;
if (a<c) a=c,ans=3;
return ans;
}
void solve(){
// printf("%d\n",sizeof(Q)/1024/1024);
sort(A+1,A+1+n,cmp);
REP(i,1,n)Q[1][r[1]++]=A[i];
REP(i,1,m){
int k=get();
int x=Q[k][l[k]++]+add;
if (i%t==0){
if (i>t)putchar(' ');
printf("%d",x);
}
int a=floor(p*(db)x),b=x-floor(p*(db)x);
add+=q;
Q[2][r[2]++]=a-add,Q[3][r[3]++]=b-add;
}
puts("");
REP(i,1,n+m){
int k=get();
int x=Q[k][l[k]++]+add;
if (i%t==0){
if (i>t)putchar(' ');
printf("%d",x);
}
}
}
}p3;
int main(){
// freopen("earthworm.in","r",stdin);
// freopen("earthworm.out","w",stdout);
cin>>n>>m>>q>>u>>v>>t;
p=1.0*u/v;
REP(i,1,n)scanf("%d",&A[i]);
// if(!m)p1.solve();
// else if(!q)p2.solve();
// else p3.solve();
p3.solve();
return 0;
}
angrybirds ——4135
思路:状压dp,啊,考试时看了好久才看出来,然而debug不出来,无fuck说…
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<map>
using namespace std;
#define REP(i,f,t) for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define DREP(i,f,t) for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define LL long long
#define db double
#define INF 0x7fffffff
#define N 20
const db eps=1e-9;
int T,n,m;
db a,b,x[N],y[N];
int sum[N][N],dp[1<<N];
void Clear() {
a=b=0;
memset(sum,0,sizeof(sum));
memset(dp,127,sizeof(dp));
}
int check(db x) {
if (x<=eps&&x>-eps)return 0;
if (x>eps)return 1;
return -1;
}
void calc(db &a,db &b,int id1,int id2) {
a=b=0;
db A=x[id1],B=y[id1],C=x[id2],D=y[id2];
if(!check(A-C))return;
a=(B*C-A*D)/(A*A*C-A*C*C);
b=(B*C*C-D*A*A)/(A*C*C-A*A*C);
}
bool on(int id1,db a,db b){
db A=x[id1],B=y[id1];
if(!check(A*A*a+A*b-B)) return 1;
return 0;
}
void Init() {
REP(i,1,n)
REP(j,i+1,n){
calc(a,b,i,j);
if(a>=0)continue;
REP(k,1,n)if(on(k,a,b))sum[i][j]|=1<<(k-1);
}
}
int main() {
// freopen("angrybirds.in","r",stdin);
// freopen("angrybirds.out","w",stdout);
cin>>T;
while(T--){
Clear();
scanf("%d%d",&n,&m);
REP(i,1,n)scanf("%lf%lf",&x[i],&y[i]);
Init();
dp[0]=0;
REP(i,0,(1<<n)-1){
REP(j,1,n){
if((i&(1<<(j-1)))==0){
REP(k,j+1,n)if((i&(1<<(k-1)))==0)dp[i|sum[j][k]]=min(dp[i|sum[j][k]],dp[i]+1);
dp[i|(1<<(j-1))]=min(dp[i|(1<<(j-1))],dp[i]+1);
break;
}
}
}
printf("%d\n",dp[(1<<n)-1]);
}
}
小结:还是我太菜了,第2题的暴力写错了而且数组还开小了…第3题状压dp bug没de出来,可以此类题还是做的太少了,同时也要多总结dp了。