B. Anton and currency you all know (贪心)
解题思路:给定一个n位数(注意10^5不是100000而是100000位),只交换一次问怎样交换才能得到最大的偶数。
最开始的错误思路:分了最后一位是偶数还是奇数来讨论,如果最后一位是偶数了,则不用管,交换前面的即可,如果最后一位不是偶数那么就从它的前一位找到第一个偶数和它交换,很容易证明这种贪心是错的----- 比如说,24158,按照刚才的贪心策略,8不用管,只需交换前面的的话,得到的最大的是54128,可是最大的该是84152----所以这种贪心是错的----
然后能够通过的贪心应该是这样的,有限制的数在最低位,如果在它之前从高位到低位遍历能够找到一个比它大的,那么马上交换 如果找不到,那么就从它的前一位找到一个偶数马上和它交换即可,(因为找不到比它大的,所以这些数字都比它小了,所以找到位数最低的偶数交换即可)
如果这两种遍历都没有满足能够获得偶数的话,就输出-1
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char a[100010]; int main() { int i,j,flag=0,n,max,min,tmp=0; scanf("%s",&a); n=strlen(a); for(i=0;i<n-1;i++) { if(a[i]%2==0&&a[i]<a[n-1]) { flag=1; swap(a[i],a[n-1]); break; } } if(flag) { printf("%s ",a); } else { for(i=n-2;i>=0;i--) { if(a[i]%2==0) { tmp=1; swap(a[i],a[n-1]); break; } } if(tmp) printf("%s ",a); else printf("-1 "); } }
C. Anya and Ghosts(贪心)
解题思路:这一题最后还是看的别人的代码,很简洁而且·思路很清晰------。
自己做的时候的误区:没有理清楚蜡烛燃烧的持续时间t和在鬼来临时必须保持r根蜡烛同时燃烧的关系------然后想到用一个数组来存放每一个时刻有多少根蜡烛在燃烧,还是没有想出正确的贪心策略----
下面是看了题解之后的一点体会
首先必须满足t>=r,这样Anya才会有足够的时间去点燃蜡烛。 接下来用一个数组f[]来储存w[i]时刻所燃烧的蜡烛,然后模拟点燃蜡烛的过程即可,即为在相应的鬼来临的时刻,差多少根蜡烛,我们就在之前相应地点燃多少根蜡烛,同时点燃的这些蜡烛也会带来相应的影响,令它点燃的时间为t0,那么[t0,t0+t]区间亮着的蜡烛数目都会加1.
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int w[10010],f[10010]; int main() { int m,t,r,i,j,k,ans=0; scanf("%d %d %d",&m,&t,&r); for(i=0;i<m;i++) scanf("%d",&w[i]); memset(f,0,sizeof(f)); if(t>=r) { for(i=0;i<m;i++) { for(j=w[i]-1;f[w[i]]<r;j--) { for(k=j+1;k<=j+t;k++) if(k>=0) f[k]++; ans++; } } printf("%d ",ans); } else printf("-1 "); }