1 #include <stdio.h> 2 int main() 3 { 4 int i,n,a[105],sum=0; 5 scanf("%d",&n); //输入纸牌堆数 6 for(i=1;i<=n;i++)//输入各堆牌数 弃置0堆 7 { 8 scanf("%d",&a[i]); 9 sum+=a[i]; 10 } 11 sum/=n;//求平均数 12 for(i=1;i<=n;i++) 13 a[i]-=sum; 14 //极端情况出现 0 0 0 x x 0 x x 0 0 x 0 0 0 0这种 15 //现在就见0直接往前挪 不是0把牌丢给右边 负数相当于逆向移牌 16 //如-3移到1变成0 -2,相当于1移3张给-3 17 i=1; 18 sum=0; 19 while(i<=n) 20 { 21 if(a[i]==0) 22 { 23 i++; 24 } 25 else 26 { 27 a[i+1]+=a[i]; 28 a[i]=0; 29 i++; 30 sum++; 31 } 32 } 33 printf("%d",sum); 34 return 0; 35 }
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 char a[250]; //存长数 6 int s,len,k,i=0; //i为当前选择的位置 7 scanf("%s",a); 8 scanf("%d",&s); 9 len=strlen(a); 10 11 while(a[i]==‘0‘) i++; //去除首0 12 //我们现在举个例子,2293620,删4次 13 //原理是删第一个单调子段的最大数 14 //第一个单调子段【相等也视为单调】 229 15 //删掉9 -> 223620 16 //删掉3 -> 22620 17 //删掉6 -> 2220 18 //删掉第一个2 -> 220 19 //整个过程就是这样 20 while(s--) 21 { 22 if(a[i]>a[i+1]) //如果是单调递减子段,直接删第一个 23 { 24 i++; 25 } 26 else if(a[i]<=a[i+1]) //单调递增子段查找最后一个字符,注意用<= 27 { 28 k=i+1; //i不动,k去找 29 while(a[k]<=a[k+1]) k++; //这个k最终到达末尾 30 while(k+1<len) //从前往后挪,挪到最后一个数是k+1 31 { 32 a[k]=a[k+1]; 33 k++; 34 } 35 len--; //减少字符长度 36 } 37 } 38 for(;i<len;i++) 39 printf("%c",a[i]); 40 41 return 0; 42 }
1 #include <stdio.h> 2 int main() 3 { 4 // freopen("missile.in","r",stdin); 5 // freopen("missile.out","w",stdout); 6 int flag,sumj=1,height,jacket[1005],i; 7 scanf("%d",&height); 8 jacket[0]=height;//先把第一个导弹拦截下来 9 while(scanf("%d",&height)==1)//你懂的 10 { 11 flag=1; 12 for(i=0;i<sumj;i++) 13 { 14 if(jacket[i]==height) break;//如果有遇到高度相同自然是不用再准备一套的 15 else if(jacket[i]>height)//一个一个找,找到就降低高度并跳出 16 { 17 jacket[i]=height; 18 flag=0; 19 break; 20 } 21 } 22 if(flag) //如果上面都没找到就准备新的导弹 23 { 24 sumj++; 25 jacket[i]=height; 26 } 27 } 28 printf("%d",sumj); 29 return 0; 30 }
原文:http://www.cnblogs.com/KakagouLT/p/4694278.html