小爱正在完成一个物理实验,为期n天,其中第i天,小爱会记录 a i a_i ai条实验数据在实验日志中。已知小爱的实验日志每一页最多纪录m条数据,每天做完实验后他都会将日志合上,第二天,他便从第一页开始依次翻页,直到找到第一个有空白位置的页码为止,开始新一天的数据记录。
请问在整个实验过程中,小爱每天为了找到第一个空白位置,需要翻多少页?
输入共两行
第一行,两个正整数n,m。
第二行,n个正整数,表示每天的数据条数。
输出共一行,n个正整数,分别表示每一天开始实验前,需要翻的页数。
对于 30 % 30\% 30% 的数据, 1 ≤ n ≤ 100 1\leq n\leq 100 1≤n≤100
对于 60 % 60\% 60% 的数据, 1 ≤ n ≤ 1 0 4 1\leq n\leq 10^4 1≤n≤104
对于 100%100% 的数据, 1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1≤n≤105
1 ≤ m , a i ≤ 1 0 4 1\leq m,a_i\leq 10^4 1≤m,ai≤104
4 10
7 8 5 12
0 0 1 2
第一天不用翻页
第二天开始前,由于只记了7条,仍是从第一页开始,不用翻页
第三天开始前,共记录了15条,则是从第二页开始,需翻1页
第四天开始前,共记录了20条,由于第二页已写满,则是从第三页开始,需翻2页
不断加入当前页数除以每一页的页数同时输出
#include
using namespace std;
const int MAXN=1e5+10;
int n,m,a[100100],cnt=0;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cout<<cnt/m<<" ";
cin>>a[i];
cnt+=a[i];
}
return 0;
}
恺撒密码是一种广为人知的加密技术。恺撒把需要加密的字母按字母表向后移动 3 位,替换成密文字母。例如,所有的 A
将被变成 D
,B
变成 E
等等。若要加密最后三个字母,则需要折回到前三个字母,比如 x
变 a,y变 b
,z
变 c
。例如以下明TheQuickBrownFoxJumpsOverTheLazyDog
将被加密成WkhTxlfnEurzqIraMxpsvRyhuWkhOdcbGrj
给定一段只由拉丁字母组成的字符序列,请将它用凯撒加密成密文。
一个字符序列:表示需要加密的明文
一个字符序列:表示加密后的密文
设输入的字符数量为 n,则保证 1 ≤ n ≤ 100 , 000 1\leq n\leq 100,000 1≤n≤100,000
TheQuickBrownFoxJumpsOverTheLazyDog
WkhTxlfnEurzqIraMxpsvRyhuWkhOdcbGrj
不断挪动每个字母的ASCII值即可,除了后三个要特判一下
注:网站数据可能有问题,会出现不是字母的字符,如果提交想得满分就得全部特判
#include
using namespace std;
char w;
int main(){
while(cin>>w){
if(w=='x') cout<<"a";
if(w=='y') cout<<"b";
if(w=='z') cout<<"c";
if(w=='X') cout<<"A";
if(w=='Y') cout<<"B";
if(w=='Z') cout<<"C";
if(w>='a'&&w<='w'||w>='A'&&w<='W') cout<<char(w+3);
}
return 0;
}
有一台自动售票机,每张票卖 5 元。售票机可以接受 5 元、10 元、2020元的纸币。接受大面额纸币时,若没有足够的零钱,售票机将拒绝售票并将纸币退还给客户,若有零钱足够,售票机必须出票并且找零。一开始,售票机里没有任何零钱。每位客户只买一张票也只会塞一张纸币。按照购票顺序,给定售票机收到的 n 张纸币的面额。请统计售货机最多能够卖出多少张票。
第一行:单个整数 n
第二行:n 个整数表示 n 名客户分别塞入的纸币面额,保证只能是 5、10、20 中的一个。
单个整数:表示售票机卖出的最多票数。
1 ≤ n ≤ 50 , 000 1\leq n\leq 50,000 1≤n≤50,000
8
10 5 5 5 10 10 20 20
6
由于没有零钱,无法把票卖给第一个人和最后一个人
这题在赛场上不知道咋回事总是只拿到五十分,重构代码后就得了满分
主要思路就是将5元10元的纸币个数记下来,主要由以下几种可能
- 五块钱就把票卖出
- 十块就减去五块
- 二十就减去一个五块加一个十块或者三个五块,由于五块灵活性更高,所以偏向于减去一个五块加一个十块
#include
using namespace std;
#define int long long
const int MAXN=5e4+10;
int n,a[MAXN],ten=0,five=0,tic=0;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]==5){
five++;
tic++;
}
if(a[i]==10){
if(five>=1){
ten++;
five--;
tic++;
}
}
if(a[i]==20){
if(ten>=1){
if(five>=1){
tic++;
ten--;
five--;
continue;
}
}
else{
if(five>=3){
tic++;
five-=3;
}
}
}
}
cout<<tic<<endl;
return 0;
}
新春佳节之际,路上挂起了一排喜气洋洋的大红灯笼,从左至右编号分别为 1 , 2 , . . . , n 1,2,...,n 1,2,...,n。但小爱发现,目前有p个灯笼不亮了,很是影响美观。
请你帮助小爱计算,最少修复多少个灯笼,便可使道路上有连续m个亮着的大红灯笼?
输入共两行:
第一行,三个正整数分别表示n,m,p
第二行,p个正整数,表示已经不亮的灯笼编号
输出共一行,一个正整数表示答案
对于 30 % 30\% 30% 的数据, 1 ≤ m , p ≤ n ≤ 100 1 \leq m,p \leq n \leq 100 1≤m,p≤n≤100
对于 60 % 60\% 60% 的数据, 1 ≤ m , p ≤ n ≤ 1 0 4 1\leq m,p \leq n \leq 10^4 1≤m,p≤n≤104
对于 100 % 100\% 100% 的数据, 1 ≤ m , p ≤ n ≤ 1 0 5 1 \leq m,p \leq n \leq 10^5 1≤m,p≤n≤105
8 5 3
5 1 8
1
只需把5号灯笼修好即可
把坏掉的灯笼位置记录下来,然后枚举区间为m的串,然后通过前缀和找出每个长度为m中坏掉的路灯最少的即可
#include
using namespace std;
const int MAXN=1e5+10;
int n,m,p,a,vh[MAXN],ans=MAXN;
int main(){
cin>>n>>m>>p;
for(int i=1;i<=p;i++){
cin>>a;
vh[a]++;
}
for(int i=1;i<=n;i++)
vh[i]+=vh[i-1];
// for(int i=0;i<=n;i++)
// cout<
for(int i=1;i<=n-m+1;i++){
if(vh[i+m-1]-vh[i-1]<ans){
ans=vh[i+m-1]-vh[i-1];
}
}
cout<<ans<<endl;
return 0;
}
三个整数分别表示 n,m,p
输出满足条件的方案数模10^9+7的结果
对于 30 % 30\% 30% 的数据, 1 ≤ n , m ≤ 10 1 \leq n,m \leq 10 1≤n,m≤10
对于 60 % 60\% 60%的数据, 1 ≤ n , m ≤ 500 1 \leq n,m \leq 500 1≤n,m≤500
对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 5000 1 \leq n,m\leq 5000 1≤n,m≤5000
4 2 2
6
设两种颜色分别为1,2
则有:1121,1211,1221,2122,2112,2212共计6种
f ( n , p ) = { f ( n − 1 , p ) + ( m − 1 ) × f ( n − 1 , p − 1 ) ( p > 0 ) f ( n − 1 , p ) ( p = 0 ) m ( p = 0 ) 0 ( p > 0 ) } n = 1 f(n,p)=\left\{\begin{matrix} f(n-1,p)+(m-1) \times f(n-1,p-1)&(p>0)\\ f(n-1,p)&(p=0)\\ \left. \begin{matrix} &m &(p=0)\\ &0 &(p>0)\\ \end{matrix} \right\}&n=1 \end{matrix}\right. f(n,p)=⎩ ⎨ ⎧f(n−1,p)+(m−1)×f(n−1,p−1)f(n−1,p)m0(p=0)(p>0)}(p>0)(p=0)n=1
注:记得加记忆化,开long long,MOD
#include
using namespace std;
#define int long long
const int MOD=1e9+7;
int n,m,p,a[5010][5010];
int f(int n,int p){
if(a[n][p]!=-1)
return a[n][p]%MOD;
if(n==1){
if(p==0) return a[n][p]=m;
if(p>0) return a[n][p]=0;
}
if(p>0)
return a[n][p]=(f(n-1,p)+(m-1)*f(n-1,p-1))%MOD;
if(p==0)
return a[n][p]=f(n-1,p)%MOD;
}
signed main(){
memset(a,-1,sizeof(a));
cin>>n>>m>>p;
cout<<f(n,p)<<endl;
}