我蓝了!蓝了!!!蒟蒻的蓝色。日常点开friend发现竟然没几个人打??然后去div1看了一下果然学长全都去打div1了呜呜呜。
看到了久违的黄大仙,以为他今晚要上grandmaster,结果打完发现他取消注册了。。。
题外话,div2半小时过完abc,d题推了一个多小时无果,div一千五百人同时在推D题,海上生明月,天涯共此时!(还好我手速快。。。)
上午考完英语三十个单选一百多个选项单词不认识。。。后天高数军理大后天大物,这几天暂时不打了。(好像也只有一场div3
A:我感觉我是瞎做的
all是整个数列的和,然后我们算前缀和sum,只要 sum!=all-sum,那么这个位置之前的都选出来就行了。注意特判个别情况
B:贪心+优先队列(或者存进数组然后排序),所有能分割的地方 都把 花费 存进来,然后前缀和<B就行。
只贴main方法,快速io太长容易引起不适,请忽略我的冒泡排序。。。
public static void main(String[] args) { int n = nextInt(); int B = nextInt(); int ans[] = new int[n]; int index = 0; int a[] = new int[n]; for(int i=0;i<n;i++){ a[i] = nextInt(); } int odd = 0; int even = 0; for(int i=0;i<n;i++){ if (a[i]%2==0) even++; else odd++; if (even==odd){ if (i==n-1){ break; }else { ans[index++]=Math.abs(a[i+1]-a[i]); odd=0; even=0; } } } for(int i=0;i<index;i++){ for(int j=i+1;j<index;j++){ if (ans[j]<ans[i]){ int temp = ans[i]; ans[i]=ans[j]; ans[j]=temp; } } } if (index==0){ out.print(0); out.flush(); return; } int sum[] = new int[index]; sum[0] = ans[0]; for(int i=1;i<index;i++){ sum[i]=sum[i-1]+ans[i]; } for(int i=0;i<index;i++){ if (sum[i]>B){ out.print(i); out.flush(); return; } } out.print(index); out.flush(); return; }
C:用了十分钟过掉的,,,还是太菜了,看了好久才找到规律
很显然我们要找到 连续 0 子段 的 个数(我太菜了说不清楚),假如有n个,那么我们n次y操作一定可以,或者n-1次x操作加一次y操作。
public static void main(String[] args) { int n = nextInt(); long x = nextLong(); long y = nextLong(); String s = next(); char ch[] = s.toCharArray(); int num = 0; for(int i=0;i<n;){ if (ch[i]=='0'){ num++; for(int j=i;j<n;j++){ if (ch[j]=='1'){ i=j; break; } else if (j==n-1){ i=n; break; } } }else i++; } if (num==0){ out.print(0); } else if (y<=x){ out.print(y*num); }else { out.print((num-1)*x+y); } out.flush(); }
D:毒瘤啊 刚才看了看学长的代码发现自己的思路竟然是错的,早知道半个小时过掉abc就去睡觉,也不至于今天英语考试一副要死的样子。。。
问题是我真的感觉自己要挂科了,贴一份学长的代码(大家可以努力看看。。。。。)
#include <iostream> using namespace std; typedef long long LL; LL n; int dp[102][10002], ans[100]; void test(){ dp[0][0]=1; for(int i=1;i<=30;i++){ for(int j=1;j<=10000;j++){ if(j>=1&&dp[i-1][j-1]) dp[i][j]=1; if(j>=5&&dp[i-1][j-5]) dp[i][j]=1; if(j>=10&&dp[i-1][j-10]) dp[i][j]=1; if(j>=50&&dp[i-1][j-50]) dp[i][j]=1; } int cnt=0; for(int j=1;j<=10000;j++) cnt+=dp[i][j]; ans[i]=cnt; //printf("%d %d\n", i, cnt); } } int main() { test(); cin>>n; if(n<20) printf("%d\n", ans[n]); else printf("%lld\n", ans[11]+(n-11)*49); }