hdu4505
/*
分析:#include"iostream" #include"cstdlib" using namespace std; int n; int aim[111]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int T; int i; int now,ans; cin>>T; while(T--) { cin>>n; for(i=0;i<n;i++)cin>>aim[i]; qsort(aim,n,sizeof(int),cmp); now=ans=0; for(i=0;i<n;i++) { if(aim[i]==now) {if(i==0)ans+=5;ans++;continue;} ans+=(aim[i]-now)*6; now=aim[i]; ans+=5; ans++; } ans+=now*4; cout<<ans<<endl; } return 0; }
hdu4506:
/*
分析:
快速幂取余的果题。
囧~~么有看数论的队友、也么有看计算几何的队友,数学方面弱到
爆的我、这个快速幂取余是比赛的时候临时学的- -III。
2013-03-21
*/
#include"iostream" using namespace std; const int N=10011; int n; __int64 t,k; __int64 node[N],ans[N]; int pre[N]; __int64 cal(__int64 a,__int64 b,__int64 c) { __int64 zz=1; a%=c; while(b>0) { if(b%2) zz=(zz*a)%c; b/=2; a=(a*a)%c; } return zz; } int main() { int T; int i; __int64 z,temp; cin>>T; while(T--) { cin>>n; scanf("%I64d%I64d",&t,&k); for(i=0;i<n;i++) scanf("%I64d",&node[i]); if(!t) { printf("%I64d",node[0]); for(i=1;i<n;i++) printf(" %I64d",node[i]); printf("\n"); continue; } z=t%n; temp=cal(k,t,1000000007); if(!temp) temp=1; for(i=0;i<n;i++) { pre[i]=i-z; if(pre[i]<0) pre[i]+=n; ans[i]=(node[pre[i]]*temp)%1000000007; } printf("%I64d",ans[0]); for(i=1;i<n;i++) printf(" %I64d",ans[i]); printf("\n"); } return 0; }
hdu4507
/*
分析:
完全背包果题。
小心会爆int。
2013-03-21
*/
#include"iostream" using namespace std; const int N=111; const int M=100111; int n,m; int w[N],val[N]; __int64 dp[M]; __int64 max(__int64 a,__int64 b) { return a>b?a:b; } int main() { int i,l; while(scanf("%d",&n)!=-1) { for(i=0;i<n;i++) cin>>val[i]>>w[i]; cin>>m; memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) for(l=w[i];l<=m;l++) dp[l]=max(dp[l],dp[l-w[i]]+val[i]); printf("%I64d\n",dp[m]); } return 0; }
hdu4509
/*
分析:
线段树。
也算是一道果题吧,只是简单的对区间的覆盖,范围也只有24*60。
2013-03-21
*/
#include"iostream" #include"cstdlib" using namespace std; const int N=500111; int n; struct Seg { int l,mid,r; int flag; //有么有被覆盖 }T[4*N]; int hash[N]; void ko(int l,int r) { int i; for(i=l;i<=r;i++) hash[i]=1; } void build(int l,int r,int k) { T[k].l=l; T[k].r=r; T[k].mid=(l+r)>>1; T[k].flag=0; if(l==r) return ; build(l,T[k].mid,2*k); build(T[k].mid+1,r,2*k+1); } void cover(int l,int r,int k) { if(T[k].l==l && T[k].r==r) { T[k].flag=1; return ; } if(r<=T[k].mid) cover(l,r,2*k); else if(l>T[k].mid) cover(l,r,2*k+1); else { cover(l,T[k].mid,2*k); cover(T[k].mid+1,r,2*k+1); } if(T[2*k].flag && T[2*k+1].flag) T[k].flag=1; } void find(int k) { int ans=0; if(T[k].flag) { ko(T[k].l,T[k].r); return ; } if(T[k].l==T[k].r) return ; find(2*k); find(2*k+1); } int main() { int i,l; char str[111]; int a,b,s,e; while(scanf("%d",&n)!=-1) { build(0,24*60-1,1); // for(i=0;i<n;i++) { cin>>str; a=b=0; for(l=0;str[l]!=':';l++) a=a*10+str[l]-'0'; for(l++;str[l];l++) b=b*10+str[l]-'0'; s=a*60+b; cin>>str; a=b=0; for(l=0;str[l]!=':';l++) a=a*10+str[l]-'0'; for(l++;str[l];l++) b=b*10+str[l]-'0'; e=a*60+b-1; if(e<s) continue; cover(s,e,1); } // memset(hash,0,sizeof(hash)); find(1); // int ans=24*60; int limit=24*60; for(i=0;i<limit;i++) if(hash[i]) ans--; cout<<ans<<endl; } return 0; }