【DFS】Codeforces Round #402 (Div. 2) B. Weird Rounding

暴搜

#include<cstdio>
#include<algorithm>
using namespace std;
int n,K,Div=1,a[21],m,ans=100;
bool vis[21];
void calc(int now)
{
	int t=0;
	bool flag=0;
	for(int i=m;i>=1;--i) if(!vis[i])
	  {
	  	if((!flag) && a[i]==0)
	  	  return;
	  	t=t*10+a[i];
	  	flag=1;
	  }
	if(t%Div==0)
	  ans=min(ans,now);
}
void dfs(int cur,int now)
{
	if(cur>m)
	  {
	  	calc(now);
	  	return;
	  }
	vis[cur]=1;
	dfs(cur+1,now+1);
	vis[cur]=0;
	dfs(cur+1,now);
}
int main()
{
//	freopen("b.in","r",stdin);
	scanf("%d%d",&n,&K);
	bool flag=0;
	while(n)
	  {
	  	a[++m]=n%10;
	  	if(a[m]==0)
	  	  flag=1;
	  	n/=10;
	  }
	if(flag)
	  ans=m-1;
	for(int i=1;i<=K;++i)
	  Div*=10;
	dfs(1,0);
	printf("%d\n",ans);
	return 0;
}
时间: 2024-10-14 14:46:31

【DFS】Codeforces Round #402 (Div. 2) B. Weird Rounding的相关文章

【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph

题意:给你一张图,给你每个点的权值,要么是-1,要么是1,要么是0.如果是-1就不用管,否则就要删除图中的某些边,使得该点的度数 mod 2等于该点的权值.让你输出一个留边的方案. 首先如果图内有-1,那么必有解.否则如果初始不合法的点数为偶数,那么必有解,否则无解.因为删一条边,要么使图中不合法的点数+2,要么不变,要么-2. 如果有解,构造图的任意一个生成树,如果有-1,就让-1为根,否则任意结点为根.然后从叶子向根定每个点的入度数,由于自底向上,一个结点的儿子边都被处理完后,只需要决定父边

【排序】【规律】Codeforces Round #254 (Div. 2) - D. Rooter&#39;s Song

D. DZY Loves FFT Source http://codeforces.com/contest/445/problem/D Description Wherever the destination is, whoever we meet, let's render this song together. On a Cartesian coordinate plane lies a rectangular stage of size w?×?h, represented by a re

【题解】Codeforces Round #600(Div.2)

Codeforces Round #600(Div.2) https://codeforces.com/contest/1253/problem A.Single Push 思路:数组各位相减,得到b-a之后的.如果全为0,或者只有一段非0且数字相同则可行,否则不可行.具体实现的话,可以左右两边指针向中间搜到第一个不为0的数,再判断中间是否均为同一个数.复杂度\(O(n)\). 注意:多组数据一定要判断是否需要清空.这里我a[n+1]没有清0,结果WA on test55-- AC代码: #in

【思维】Codeforces Round #485 (Div. 2) B. High School: Become Human(对数)

题目链接:http://codeforces.com/contest/987/problem/B 在运算的时候取对数就好了 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define ll long long 6 #define eps 1e-6 7 8 int main() 9 { 10 ll x,y; 11 double xx; 12 scanf("%lld %lld",&x,&y);

【暴力】Codeforces Round #398 (Div. 2) A. Snacktower

题意不复述. 用个bool数组记录一下,如果某一天,当前剩下的最大的出现了的话,就输出一段. #include<cstdio> using namespace std; int n; bool vis[100010]; int main() { // freopen("a.in","r",stdin); scanf("%d",&n); int x; int now=n; for(int i=1;i<=n;++i) { s

【贪心】Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

从后向前枚举字符串,然后从左向右枚举位. 如果该串的某位比之前的串的该位小,那么将之前的那串截断. 如果该串的某位比之前的串的该位大,那么之前那串可以直接保留全长度. 具体看代码. #include<cstdio> #include<iostream> #include<string> using namespace std; string a[500010]; int n,lens[500010],b[500010]; int main() { // freopen(

【枚举】Codeforces Round #394 (Div. 2) C. Dasha and Password

纪念死去的智商(虽然本来就没有吧--) 三重循环枚举将哪三个fix string作为数字.字母和符号位.记下最小的值就行了. 预处理之后这个做法应该是O(n^3)的,当然完全足够.不预处理是O(n^3*m)的,也够. 我写了一个O(n^2+n*m)的分类讨论贪心做法--蜜汁错,容我查一下. 现在查出个错,交了一下在in queue--容我明天看看对不对. 如果对的话,这题的加强版明年留作趣味赛题吧,嘿嘿嘿-- #include<cstdio> #include<algorithm>

【动态规划】Codeforces Round #406 (Div. 2) C.Berzerk

有向图博弈问题. 能转移到一个必败态的就是必胜态. 能转移到的全是必胜态的就是必败态. 转移的时候可以用队列维护. 可以看这个 http://www.cnblogs.com/quintessence/p/6618640.html #include<cstdio> #include<queue> using namespace std; struct Node{ int who,pos; }; queue<Node>q; int n,len[2],to[2][7010],

【动态规划】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip

划分那个序列,没必要完全覆盖原序列.对于划分出来的每个序列,对于某个值v,要么全都在该序列,要么全都不在该序列. 一个序列的价值是所有不同的值的异或和.整个的价值是所有划分出来的序列的价值之和. 求整个的价值的最大值 f(i)表示最后一个划分序列的右端点为i时,1~i的答案. f(i)=max{max{f(j)}(1<=j<i)+xorsum(j+1,i)(j+1到i的区间合法)}(1<=i<=n) 需要在转移的时候,顺便处理f(i)的前缀max. 最终的答案就是所有f(i)的最大