A. Div. 7
思路:
注
意
n
>
=
10
,
说
明
一
定
是
两
位
数
注意n>=10,说明一定是两位数
注意n>=10,说明一定是两位数
并
且
7
个
一
循
环
,
直
接
枚
举
这
位
数
的
最
后
一
位
并且7个一循环,直接枚举这位数的最后一位
并且7个一循环,直接枚举这位数的最后一位
暴
力
判
断
是
否
可
行
即
可
暴力判断是否可行即可
暴力判断是否可行即可
时间复杂度:
O
t
Ot
Ot
#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;}
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
signed main()
{
cf
{
int n ;
cin >> n ;
if(n % 7 == 0) de(n) ;
else
{
string s = to_string(n) ;
for(char i = '0' ; i <= '9' ; i ++)
{
s[sz(s) - 1] = i ;
if(stoi(s) % 7 == 0)
{
de(s) ;
break ;
}
}
}
}
return 0;
}
B. Minority
思路:
假
设
该
字
符
串
0
的
数
量
为
a
假设该字符串0的数量为a
假设该字符串0的数量为a
1
的
数
量
为
b
1的数量为b
1的数量为b
如
果
a
=
b
,
显
然
答
案
为
m
a
x
(
a
−
1
,
0
)
如果a=b,显然答案为max(a-1,0)
如果a=b,显然答案为max(a−1,0)
如
果
a
>
b
,
答
案
为
b
如果a>b,答案为b
如果a>b,答案为b
如
果
a
<
b
,
答
案
为
a
如果a<b,答案为a
如果a<b,答案为a
时间复杂度:
O
n
On
On
#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;}
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
signed main()
{
cf
{
string s ;
int s1 = 0 , s2 = 0 ;
cin >> s ;
for(auto i : s)
{
if(i == '1') s1 ++ ;
else s2 ++ ;
}
if(s1 == s2) de(max(s1 - 1 , 0ll)) ;
else if(s1 > s2) de(s2) ;
else de(s1) ;
}
return 0;
}
C. Kill the Monster
思路:
注
意
到
k
的
总
和
为
2
e
5
注意到k的总和为2e5
注意到k的总和为2e5
那
么
我
们
可
以
枚
举
生
命
h
c
加
i
次
,
攻
击
d
c
加
k
−
i
次
那么我们可以枚举生命hc加i次,攻击dc加k-i次
那么我们可以枚举生命hc加i次,攻击dc加k−i次
o
1
判
断
即
可
o1判断即可
o1判断即可
时
间
复
杂
度
o
k
时间复杂度ok
时间复杂度ok
如
何
o
1
判
断
如何o1判断
如何o1判断
敌
人
杀
死
我
需
要
⌈
h
c
d
m
⌉
个
回
合
敌人杀死我需要\lceil \frac{hc}{dm} \rceil个回合
敌人杀死我需要⌈dmhc⌉个回合
我
杀
死
敌
人
需
要
⌈
h
m
d
c
⌉
个
回
合
我杀死敌人需要\lceil \frac{hm}{dc} \rceil个回合
我杀死敌人需要⌈dchm⌉个回合
即
即
即
⌈
h
c
d
m
⌉
>
=
⌈
h
m
d
c
⌉
\lceil \frac{hc}{dm} \rceil >= \lceil \frac{hm}{dc} \rceil
⌈dmhc⌉>=⌈dchm⌉
时间复杂度: O k Ok Ok
#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;}
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
bool check(int hc , int dc , int hm , int dm)
{
int len = (hc + dm - 1) / dm ;
if(len * dc >= hm) return 1 ;
else return 0 ;
}
signed main()
{
cf
{
int hc , dc , hm , dm , k , w , a ;
sf2(hc , dc) ;
sf2(hm , dm) ;
sf(k) ;
sf2(w , a) ;
int f1 = 0 ;
for(int i = 0 ; i <= k ; i ++)
{
int j = k - i ;
if(check(hc + i * a , dc + j * w , hm , dm )) f1 = 1 ;
}
if(f1) puts("YES") ;
else puts("NO") ;
}
return 0;
}
D. Make Them Equal
思路:
注
意
到
每
次
a
[
i
]
变
成
b
[
i
]
都
是
从
1
开
始
变
化
的
注意到每次a[i]变成b[i]都是从1开始变化的
注意到每次a[i]变成b[i]都是从1开始变化的
也
就
是
说
我
们
可
以
先
预
处
理
一
个
数
组
d
[
i
]
数
组
也就是说我们可以先预处理一个数组d[i]数组
也就是说我们可以先预处理一个数组d[i]数组
表
示
1
变
化
到
i
的
最
小
操
作
数
表示1变化到i的最小操作数
表示1变化到i的最小操作数
注
意
到
b
[
i
]
的
最
大
值
是
1
e
3
注意到b[i]的最大值是1e3
注意到b[i]的最大值是1e3
我
们
可
以
暴
力
b
f
s
用
O
1
e
6
的
时
间
复
杂
度
预
处
理
该
数
组
我们可以暴力bfs用O1e6的时间复杂度预处理该数组
我们可以暴力bfs用O1e6的时间复杂度预处理该数组
然
后
在
把
题
目
转
换
一
下
然后在把题目转换一下
然后在把题目转换一下
操
作
数
最
多
是
k
操作数最多是k
操作数最多是k
对
于
每
个
i
,
变
成
b
[
i
]
的
操
作
数
为
d
[
i
]
对于每个i,变成b[i]的操作数为d[i]
对于每个i,变成b[i]的操作数为d[i]
你
可
以
得
到
c
[
i
]
个
硬
币
你可以得到c[i]个硬币
你可以得到c[i]个硬币
显
然
,
操
作
数
k
我
们
可
以
看
作
是
背
包
体
积
显然,操作数k我们可以看作是背包体积
显然,操作数k我们可以看作是背包体积
对
于
每
个
i
,
变
成
b
[
i
]
的
操
作
数
为
d
[
i
]
,
可
以
看
作
是
物
品
i
的
体
积
为
d
[
i
]
对于每个i,变成b[i]的操作数为d[i],可以看作是物品i的体积为d[i]
对于每个i,变成b[i]的操作数为d[i],可以看作是物品i的体积为d[i]
你
可
以
得
到
c
[
i
]
个
硬
币
,
可
以
看
作
是
物
品
i
的
价
值
c
[
i
]
你可以得到c[i]个硬币,可以看作是物品i的价值c[i]
你可以得到c[i]个硬币,可以看作是物品i的价值c[i]
每 个 物 品 最 多 选 一 次 , 跑 01 背 包 即 可 每个物品最多选一次,跑01背包即可 每个物品最多选一次,跑01背包即可
注
意
到
d
[
i
]
数
组
的
最
大
值
为
12
注意到d[i]数组的最大值为12
注意到d[i]数组的最大值为12
也
就
是
说
背
包
体
积
最
大
为
12
∗
1
e
3
也就是说背包体积最大为12*1e3
也就是说背包体积最大为12∗1e3
假
设
背
包
体
积
为
m
,
m
=
m
i
n
(
12
∗
n
,
k
)
假设背包体积为m,m=min(12*n,k)
假设背包体积为m,m=min(12∗n,k)
时
间
复
杂
度
=
m
i
n
(
12
∗
n
,
k
)
∗
n
+
n
2
≈
1
e
7
时间复杂度=min(12*n,k)*n + n^2 \approx 1e7
时间复杂度=min(12∗n,k)∗n+n2≈1e7
时间复杂度:
O
m
i
n
(
12
∗
n
,
k
)
∗
n
+
n
2
Omin(12*n,k)*n + n^2
Omin(12∗n,k)∗n+n2
#include <bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define der(i,a,b) for(re i = a ; i >= b ; -- i)
#define cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int>
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long
#define pb push_back
#define y second
#define x first
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;}
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
int n , k ;
int b[N] ;
int c[N] ;
int d[N] ;
int f[N] ;
signed main()
{
// bfs预处理d数组
memset(d , -1 , sizeof d) ;
d[1] = 0 ;
queue<int> q ;
q.push(1) ;
while(q.size())
{
auto t = q.front() ;
q.pop() ;
for(int j = 1 ; j <= t ; j ++)
{
int x = t + t / j ;
if(x > 1e3) continue ;
if(d[x] != -1 || x == 1) continue ;
d[x] = d[t] + 1 ;
q.push(x) ;
}
}
cf
{
cin >> n >> k ;
fer(i,1,n) sf(b[i]) ;
fer(i,1,n) sf(c[i]) ;
int m = min(k,20000*1ll) ;
fer(i,0,m) f[i] = 0 ;
// 01背包
for(int i = 1 ; i <= n ; i ++)
{
for(int j = m ; j >= d[b[i]] ; j --)
f[j] = max(f[j],f[j - d[b[i]]] + c[i]);
}
de(f[m]) ;
}
return 0;
}