//1001
点击打开链接
//刚开始人全部上在电梯上。。要排下序。。。
#include"stdio.h" #include"stdlib.h" struct node { int x; }a[101]; int cmp(const void*a,const void*b) { return (*(struct node*)a).x-(*(struct node*)b).x; } int main() { int ans,t,n,b,i; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i].x); qsort(a,n,sizeof(a[0]),cmp); b=0;ans=0; for(i=0;i<n;i++) { if(a[i].x==b)ans++; else if(a[i].x>b)ans+=(a[i].x-b)*6+5+1; else ans+=(b-a[i].x)*4+5+1; b=a[i].x; } ans+=b*4; printf("%d\n",ans); } return 0; }
//1002
点击打开链接
这道题学了:个东西::快速幂取余
#include"stdio.h" __int64 fun(__int64 a,__int64 b,__int64 c)//a的b次方对c求余 { __int64 ans=1; a%=c; while(b>0) { if(b%2==1)ans=(ans*a)%c; b/=2; a=(a*a)%c; } return ans; } int main() { int n,i,T,b[10001]; __int64 t,k,a[10001],ans[10001]; scanf("%d",&T); while(T--) { scanf("%d%I64d%I64d",&n,&t,&k); for(i=0;i<n;i++) scanf("%I64d",&a[i]); k=fun(k,t,1000000007);//计算k的t次方对1000000007求余 if(k==0)k=1; t=t%n;//. for(i=0;i<n;i++) { b[i]=i-t;//b[i]表示a[i]经过t次运算后的下标 if(b[i]<0)b[i]+=n;//可能为负 ans[i]=(a[b[i]]*k)%1000000007; } for(i=0;i<n-1;i++) printf("%I64d ",ans[i]); printf("%I64d\n",ans[i]); } return 0; }
//1003
//1004
是完全背包..
背包不一定要装满!!.
#include"stdio.h" #include"string.h" #define max(x,y) x>y?x:y; int dp[100001]; int main() { int n,m,a[101],b[101]; int i,j; while(scanf("%d",&n)!=-1) { for(i=0;i<n;i++) scanf("%d%d",&a[i],&b[i]); scanf("%d",&m); memset(dp,0,sizeof(dp)); for(i=0;i<n;i++) { for(j=b[i];j<=m;j++)//不一定装满 { dp[j]=max(dp[j],dp[j-b[i]]+a[i]); } } printf("%d\n",dp[m]); } return 0; }
线段树的题。但是可以不用模版。。。。
12:00-12:01只标记12:00,代表第12*60分钟被使用..
点击打开链接
#include"stdio.h" #include"string.h" int mark[1441]; void fun(char str[]) { int a,b,c,d; a=(str[0]-'0')*10+str[1]-'0'; b=(str[3]-'0')*10+str[4]-'0'; c=(str[6]-'0')*10+str[7]-'0'; d=(str[9]-'0')*10+str[10]-'0'; a=a*60+b; b=c*60+d; for(;a<b;a++) mark[a]=1;//如果时间是12:00-12:01标记12:00;mark[i]表示第i分钟被占用.... } int main() { int n,i,sum; char str[12]; while(scanf("%d",&n)!=-1) { getchar(); memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) { gets(str); fun(str); } sum=0; for(i=0;i<1440;i++) if(mark[i]==0)sum++; printf("%d\n",sum); } return 0; }