MG loves apple

 Accepts: 20
 Submissions: 693
 Time Limit: 3000/1500 MS (Java/Others)
 Memory Limit: 262144/262144 K (Java/Others)

问题描述
MGMG是一个财富爆表的男孩子。他拥有N(1<=N<=100000)N(1<=N<=100000)个苹果,每个苹果上标有一个数字00~99,代表它的价值。 一个合法的数字是不含有前导零的,这nn个苹果恰好排成了一个合法的NN位数。 MGMG拥有拿去KK个苹果的权利(0<=K<0<=K<NN)。 他想知道是否存在方案,使得恰好拿去KK个苹果后,序列中剩下的苹果排成的合法数字模33等于零。数据保证所有NN之和不超过10000001000000. MGMG认为这件事非常容易,不屑于用计算机解决,于是运用他高超的人类智慧开始进行计算。作为一名旁观者,你也想挑战MGMG智慧,请你写个程序,计算答案。
输入描述
第一行一个整数TT,代表数据组数(1 <=T<=601<=T<=60)。 接下来,对于每组数据—— 第一行两个个整数NN,KK,表示苹果序列长度,以及需要拿去的苹果个数. 接下来一行NN个整数XX,表示每个苹果的价值(0<=X<=90<=X<=9)。 
输出描述
对于每一组数据,输出一行。
若方案存在,则输出“yes”,否则输出“no”。(输出不包含引号)
输入样例
2
5 2
11230
4 2
1000 
输出样例
yes
no

【分析】

  写这个主要是我昨天WA了7次没A。。

  怎么说,打法太容易出bug。。

  【表示不知道别人是怎么做的。。。

  为了保证没有前导0,我们枚举一个不为0的开头,于是问题变成了询问在a0个0,a1个1,a2个2中选x个数,他们加上y能不能模3等于0。

  这个东西啊,我是不敢枚举什么的。我们可以先随便选x个数,然后判断,不行的话,交换1个或者两个选了和没选的数,再判断。

  显然交换的数的个数不会超过2个的哦。

  这里我就暴力枚举交换的东西了。

  【主要是我昨天没有枚举最前面的数,而是贪心先删掉后k个再交换,然后前面交换时的前导0没有了保证,就搞了很久。。。

  【还是ORZ那些秒A的人

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 100010
 8
 9 int mymax(int x,int y) {return x>y?x:y;}
10 int mymin(int x,int y) {return x<y?x:y;}
11
12 int f[Maxn][3];
13 int b[3],c[3];
14
15 bool check(int a0,int a1,int a2,int x,int y)
16 {
17     // if(x==0) return y==0;
18     // if(x==1) return (y==0&&a0)||(y==1&&a1)||(y==2&&a2);
19     int h=0;
20     b[0]=b[1]=b[2]=c[0]=c[1]=c[2]=0;
21     b[0]=mymin(a0,x);c[0]=a0-b[0],x-=b[0];
22     b[1]=mymin(a1,x);c[1]=a1-b[1],x-=b[1],h=(h+b[1])%3;
23     b[2]=mymin(a2,x);c[2]=a2-b[2],x-=b[2],h=(h+b[2]*2)%3;
24     if((h+y)%3==0) return 1;
25
26     for(int i=0;i<3;i++) if(b[i])
27      for(int j=0;j<3;j++) if(c[j])
28          if(((h-i+j+y)%3+3)%3==0) return 1;
29
30     for(int i=0;i<3;i++) if(b[i])
31     {
32         b[i]--;
33         for(int ii=0;ii<3;ii++) if(b[ii])
34         {
35             for(int j=0;j<3;j++) if(c[j])
36             {
37                 c[j]--;
38                 for(int jj=0;jj<3;jj++) if(c[jj])
39                 {
40                     if(((h-i-ii+j+jj+y)%3+3)%3==0) return 1;
41                 }
42                 c[j]++;
43             }
44         }
45         b[i]++;
46     }
47     return 0;
48 }
49
50 int a[Maxn];
51 char s[Maxn];
52
53 int main()
54 {
55     int T;
56     scanf("%d",&T);
57     while(T--)
58     {
59         int n,k;
60         scanf("%d%d",&n,&k);
61         scanf("%s",s+1);
62         for(int i=1;i<=n;i++) a[i]=s[i]-'0';
63         if(k==n-1)
64         {
65             bool ok=0;
66             for(int i=1;i<=n;i++) if(a[i]%3==0) ok=1;
67             if(ok) printf("yes\n");
68             else printf("no\n");
69             continue;
70         }
71         memset(f,0,sizeof(f));
72         for(int i=1;i<=n;i++)
73          for(int j=0;j<3;j++) f[i][j]=f[i-1][j]+(a[i]%3==j);
74         k=n-k;
75         bool ok=0;
76         for(int i=1;i<=n-k+1;i++) if(a[i]!=0)
77         {
78             if(check(f[n][0]-f[i][0],f[n][1]-f[i][1],f[n][2]-f[i][2],k-1,a[i]%3)) {ok=1;break;}
79         }
80         if(ok) printf("yes\n");
81         else printf("no\n");
82     }
83     return 0;
84 }

View Code

2017-04-02 08:51:33

转载于:https://www.cnblogs.com/Konjakmoyu/p/6658191.html

【HDU 6020】 MG loves apple (乱搞?)相关推荐

  1. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  2. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  3. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  4. BZOJ-1800 飞行棋 数学+乱搞

    这道题感觉就是乱搞,O(n^4)都毫无问题 1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1172 So ...

  5. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 367  Solved: 159 [Submit][Status ...

  6. BZOJ4401:块的计数(乱搞)

    Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构--块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...

  7. HDU - 5658 CA Loves Palindromic(回文自动机/哈希+树状数组)

    题目链接:点击查看 题目大意:给出一个字符串 s ,接下来给出 m 个查询,每次查询的形式会给出一个 l 和 r ,问区间 [ l , r ] 内有多少个本质不同的回文子串 题目分析:因为查询的次数比 ...

  8. Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】

    题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...

  9. 【uoj#209】[UER #6]票数统计 组合数+乱搞

    题目描述 一个长度为 $n$ 的序列,每个位置为 $0$ 或 $1$ 两种.现在给出 $m$ 个限制条件,第 $i$ 个限制条件给出 $x_i$ .$y_i$ ,要求至少满足以下两个条件之一: 序列的 ...

  10. 【NOI2018】你的名字【后缀自动机】【可持久化线段树合并】【乱搞】

    题意:给一个串 SSS,qqq 次询问,每次给定串 TTT 和 l,rl,rl,r ,求有多少个本质不同的串是 TTT 的子串而不是 Sl-rS_{l\dots r}Sl-r​ 的子串. ∣S∣≤5× ...

最新文章

  1. Hadoop机架感知与balancer
  2. python大神的成长之路_Python大神成长之路: 第二次学习记录
  3. 勾引百度谷歌的蜘蛛爬虫
  4. java注销对话框_【java小程序实战】小程序注销功能实现
  5. 新巴巴运动网 项目第十一天
  6. .net framework摘抄与理解
  7. python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!
  8. 【OpenCV学习笔记】2.1OpenCV基本数据类型
  9. python快速入门教程-Python 开发 14 天快速入门
  10. Divide Two Integers leetcode java
  11. java环境_Java 开发环境配置
  12. 骑在银龙的背上歌词(带罗马音)
  13. 如何使用poi在word表格中新增行的4种方法
  14. 苹果用计算机密码,苹果mac修改用户名与密码的方法 苹果电脑如何修改开机密码...
  15. 利用matlab制作光栅动画(莫尔条纹动画)
  16. oracle版本虚拟机,关于虚拟机装oracle10g64位数据库查看版本位数有趣的问题
  17. shared_ptr,weak_ptr,unique_ptr
  18. kodi android 目录,如何在xbmc / kodi插件中创建多个目录?
  19. cmd 命令行执行 Python 脚本
  20. 英特尔投资部宣布增投10家新创公司,他们都有哪些能耐?---ESM

热门文章

  1. 固定大小采样池中的随机采样证明
  2. nyoj--860--又见01背包--01背包的变形
  3. 迭代总结(随时更新)
  4. Linux软件安装到指定目录方法
  5. 乌克兰发布新版《网络安全战略》
  6. 《Arduino奇妙之旅:智能车趣味制作天龙八步》一第2章
  7. 我用微笑剪辑我的微电影 ---六月实习总结
  8. C# 程序启动其他进程程序
  9. Starling自适应设备大小的做法
  10. (转)WinForm中的各种表格控件