A-出题
小B准备出模拟赛。
她把题目按难度分为四等,分值分别为6,7,8,9。
已知小B共出了m道题,共n分。
求小B最少出了多少道6分题。
两个正整数n,m
一个数,表示答案。
若无解,输出"jgzjgzjgz"。
示例1
复制
34 5
复制
1
示例2
复制
32 5
复制
3
示例3
复制
5 1
复制
jgzjgzjgz
n,m≤1012
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
ll n,m;
int main()
{
while(~scanf("%lld%lld",&n,&m)){
if(n<6*m||n>9*m){
printf("jgzjgzjgz\n");
return 0;
}
if(n/m>=7){
printf("0\n");
return 0;
}
ll p=n/m;
ll ans=n-p*m;
printf("%lld\n",m-ans);
}
}
B-煤气灶
小j开始打工,准备赚钱买煤气灶。
第一天,小j的工资为n元,之后每天他的工资都比前一天多d元。
已知煤气灶需要m元,求小j最少工作几天才能买到煤气灶。
四个整数 n,m,d,x
分别表示小j第一天的工资,煤气灶的价格,工资每天的增长量,答案不超过x
一个数表示答案
示例1
复制
10 100 20 100
复制
4
10+30+50+70>=100
0≤n,d≤109,n+d>00≤n,d≤109,n+d>0
1≤m≤10181≤m≤1018
1≤x≤109
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
ll n,d,m;
int main()
{
int x;
while(~scanf("%lld%lld%lld%d",&n,&m,&d,&x)){
if(n>=m){
printf("1\n");
return 0;
}
ll ans=n,t=1;
while(ans
C-项链
小B想给她的新项链染色。
现在有m种颜色,对于第i种颜色,小B有a_i单位的颜料,每单位颜料可以染项链的一个珠子;
同时,小B对于第i种颜色的喜爱度为b_i。
已知项链有n个珠子,求染色后每个珠子的颜色的喜爱度之和的最大值。
(每个珠子只能至多被染一次,不被染色则喜爱度为0)
第一行两个数n,m
第二行m个数a_i
第三行m个数b_i
一个数表示答案
示例1
复制
5 3
1 2 3
3 2 1
复制
9
示例2
复制
5 3
1 2 1
3 2 1
复制
8
1≤n,m≤105,0≤ai,bi≤1061≤n,m≤105,0≤ai,bi≤106
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e5+10;
ll n,m;
struct node
{
ll a;
ll b;
}p[N];
bool cmp(node x,node y)
{
return x.b>y.b;
}
int main()
{
while(~scanf("%lld%lld",&n,&m)){
for(int i=1;i<=m;i++)
scanf("%lld",&p[i].a);
for(int i=1;i<=m;i++)
scanf("%lld",&p[i].b);
sort(p+1,p+1+m,cmp);
int t=1;
ll ans=0;
while(n>0){
if(n>=p[t].a){
n-=p[t].a;
ans+=p[t].a*p[t].b;
}
else {
ans+=p[t].b*n;
n-=p[t].a;
}
t++;
if(t>m)
break;
}
printf("%lld\n",ans);
}
}
D-美食
小B喜欢美食。
现在有n个美食排成一排摆在小B的面前,依次编号为1..n,编号为i的食物大小为 a[i] ,即足够小B吃 a[i] 口。
小B每次会吃两口,这两口要么是编号相同的美食,要么是编号之差的绝对值为1的美食。
小B想知道,她最多能吃几次?
第1行一个正整数n,表示美食个数
接下来n行,第i行一个整数a[i],表示编号为i的美食的大小
一个数表示小B最多吃几次。
示例1
复制
4
1
5
7
8
复制
10
用二元组(a,b)表示某一次吃的两个美食分别为第a个美食和第b个美食,则下面为一个吃10次的方案:
(1,2)(2,2)(2,2)(3,4)(3,4)(3,4)(3,4)(3,4)(3,4)(3,4)
注意不一定要吃完。
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e5+10;
int n,a[N];
ll ans;
int main()
{
while(~scanf("%d",&n)){
met(a,0);
ans=0;
for(int i=1;i<=n;i++)
sc(a[i]);
for(int i=1;i<=n;i++){
if(a[i]==0)
continue;
if(a[i]%2==0)
ans+=a[i]/2;
else {
if(a[i+1]==0){
ans+=a[i]/2;
continue;
}
ans+=a[i]/2+1;
a[i+1]--;
}
}
printf("%lld\n",ans);
}
}
G-区间或和
求a|(a+1)|(a+2)|...|(b-1)|b。
其中|表示[按位或](https://baike.baidu.com/item/%E6%8C%89%E4%BD%8D%E6%88%96)。
多组输入,每行两个数表示a和b
对于每组输入,输出一个数a|(a+1)|(a+2)|...|(b-1)|b。
示例1
复制
99 109
68 77
55 66
34 43
1111234 1114321
复制
111
79
127
47
1179647
输入不超过10000行,0≤a,b≤10180≤a,b≤1018,a≤b
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define LL long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
LL a,b;
LL ans;
int main()
{
while(~scanf("%lld%lld",&a,&b)){
LL ans=0;
bool flag=false;
for(int i=62;i>=0;i--){
LL tmp=1ll<
I-wzoi
bleaves 最近在 wzoi 上面做题。
wzoi 的题目有两种,一种是 noip 题,一种是省选题。
bleaves 的做题方式很特别。每一天,她可能会看一道题目,这时她会选择题目种类,然后 wzoi 会在选定种类中随机扔给她一道她还没看过的题,她会把这道题看一遍,然后存在脑子里慢慢思考;她也有可能写题,这时她一定会写没写过的题中看的时间最迟的一题(如果不存在没写过的且没看过的题,她就不能写题)。
wzoi 每天会有一个推荐的题目种类,
如果 bleaves 看一道题目:如果种类和推荐的相同,那么这道题目最大得分为10,否则为5
如果 bleaves 写一道题目:如果种类和推荐的相同,那么这道题目得分为最大得分,否则为最大得分-5
假如 bleaves 现在还没看过任何一题,并且她知道了 wzoi 接下来一些天每天推荐的种类,问她在这些天的最大得分。
一行一个01串 s ,|s| 表示天数,si=0si=0 表示 wzoi 第 i 天推荐 noip 题, si=1si=1 表示 wzoi 第 i 天推荐省选题。
一行一个整数最大得分。
示例1
复制
0011
复制
20
4天行动依次为:看一道 noip 题,写第1天看的题,看一道省选题,写第3天看的题。
示例2
复制
0101
复制
10
4天行动依次为:看一道 noip 题,写第1天看的题,看一道noip题,写第3天看的题。
示例3
复制
0110
复制
20
4天行动依次为:看一道 noip 题,看一道省选题,写第2天看的题,写第1天看的题。
全部的输入数据满足:1≤n≤1061≤n≤106 , n 为偶数。
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e6+10;
char s[N],t[N];
int ans;
int main()
{
while(~scanf("%s",s)){
int len=strlen(s);
int tmp=0;
ans=0;
met(t,0);
for(int i=0;i0){
ans+=10;
tmp--;
continue;
}
t[++tmp]=s[i];
}
ans+=tmp/2*5;
printf("%d\n",ans);
}
}
J-迷宫
你在一个 n 行 m 列的网格迷宫中,迷宫的每一格要么为空,要么有一个障碍。
你当前在第 r 行第 c 列(保证该格子为空)。每次移动你可以向上下左右任意一个方向移动一格,前提是不能走到障碍上,也不能超出迷宫的边界。
你向左移动的次数不能超过 x 次,向右不能超过 y 次。
问在这种情况下,对于每个格子,是否存在一种移动方案让你走到它。
输出有多少个格子存在移动方案让你走到它。
第一行两个正整数 n,m 。
第二行两个正整数 r,c ,保证 1≤r≤n1≤r≤n ,1≤c≤m1≤c≤m 。
第三行两个整数 x,y ,保证 0≤x,y≤1090≤x,y≤109 。
接下来 n 行,每行一个长度为 m 的字符串,
第 i 行第 j 个字符表示迷宫第 i 行第 j 列的格子,
字符为`.` 表示格子为空,字符为`*` 表示格子上有一个障碍。
输出一个数,表示有多少个格子存在移动方案让你走到它。
示例1
复制
4 5
3 2
1 2
.....
.***.
...**
*....
复制
10
将能走到的格子用+标记:
+++..
+***.
+++**
*+++.
示例2
复制
4 4
2 2
0 1
....
..*.
....
....
复制
7
.++.
.+*.
.++.
.++.
对于全部数据, 1≤n,m≤10001≤n,m≤1000 。
#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x) priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
int n,m,q,e,r,c,ans;
char a[1010][1010];
bool vis[1010][1010];
struct node
{
int x,y,q,e;
node(int x1,int y1,int q1,int e1) : x(x1),y(y1),q(q1),e(e1){}
};
queuequ;
int main()
{
while(~scanf("%d%d%d%d%d%d",&n,&m,&r,&c,&q,&e)){
for(int i=1;i<=n;i++){
char p=getchar();
for(int j=1;j<=m;j++)
scanf("%c",&a[i][j]);
}
qu.push(node(r,c,q,e));
ans=0;
met(vis,0);
while(!qu.empty()){
node no=qu.front();
qu.pop();
if(vis[no.x][no.y]||a[no.x][no.y]=='*')
continue;
ans++;
vis[no.x][no.y]=1;
if(no.x1)
qu.push(node(no.x-1,no.y,no.q,no.e));
if(no.y>1&&no.q>0)
qu.push(node(no.x,no.y-1,no.q-1,no.e));
if(no.y0)
qu.push(node(no.x,no.y+1,no.q,no.e-1));
}
printf("%d\n",ans);
}
}