1.时长 【time】
描述
今年的环湖马拉松赛,出发枪响时刻是a时b分,冠军到达终点的时刻是c时d分。问冠军用时多少分钟跑完全程。
输入
共两行。第一行,两个整数a和b
第二行,两个整数c和d
保证出发时刻在到达时刻之前
输出
输出一行为一个整数,意义如题所述。
输入样例 1
9 10 10 50
输出样例1
100
提示
数据范围/约定
0<=a,c<=23
0<=b,d<=59
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d;
cin>>a>>b;
cin>>c>>d;
//这题就是数学题
cout<<(c-a)*60+(d-b);
return 0;
}
2.解密 【key】
描述
为了防止信息传递过程中被截获,往往需要对传输的文本用一定的方式加密, 简单的加密算法虽然不足以完全避免信息被破译,但仍然能防止信息被轻易的识别
有一种对26个字母的加密方式是"对称加密"。所谓"对称加密"就是26个英文字母,以中间为对称轴,左右对称,比如,A被加密为Z, Y被加密为B,小写字母也是如此,如c被加密为x,W被加密为d
现在给定一个加密后的字母,请输出加密前是哪一个字母.
输入
一个英文字母,为A~Z或a~z中的一个,表示加密后的字母。
输出
一个字母,为加密前的字母。
输入样例 1复制
Z
输出样例1复制
A
#include<bits/stdc++.h>
using namespace std;
int main(){
//凯撒加密
char a;
cin>>a;
if(a>='a'&&a<='z'){
cout<<(char)(219-a)<<endl;
}else{
cout<<(char)(155-a)<<endl;
}
return 0;
}
凯撒加密,但是升级版
3.选择 【min】
描述
正方体是特殊的长方体,棱长都相等。有个正方体, 现在需要挑选出棱长最小的正方体。依次给定N个正方体的棱长,输出棱长最小正方体的序号,若有多个,按照序号由小到大输出。
输入
第一行,一个整数N
第二行,N个整数,依次表示序号1~序号N正方体的棱长
输出
输出一行,一个或多个整数,意义如题所述。
输入样例 1复制
8 9 2 5 4 3 9 2 6
输出样例1复制
2 7
提示
数据范围/约定.
1<=N<= 100000 ,1<=棱长<=100000
#include<bits/stdc++.h>
using namespace std;
int main(){
//类似桶
int n,a[100005],minn=100000;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]<minn){
minn=a[i];
}
}
for(int i=0;i<n;i++){
if(a[i]==minn){
cout<<i+1<<" ";
}
}
return 0;
}
4.座位 【seat】
描述
考场座位号般按照S型排列, 现在知道某个考生的考号,问其所在第几排第几个座位,即所在的行和列。比如如图所示
考场,有7行4列的座位,12号考生所在的座位为3行2列
输入
第一行,为三个整数N,M和K,表示考场有N行M列的座位,K为考生考号。
输出
两个整数,表示K号考生所在行和列
输入样例 1复制
7 4 12
输出样例1复制
3 2
提示
数据范围/约定
0<N,M<=1000
K<=N*M
#include<bits/stdc++.h>
using namespace std;
int a,ans1,ans2,n,m;
int main(){
cin>>n>>m>>a;
if(a<=n){
ans1=1,ans2=a;
cout<<a<<' '<<1;
return 0;
}else{
ans1=a/n;
ans2=a%n;
if(ans2==0){
ans2=n;
}
else{
ans1++;
}
if(ans1%2==0){
ans2=n-ans2+1;
}
}
cout<<ans2<<" "<<ans1;
return 0;
}
纯模拟
5.
描述
李老板需要总长为M米的木材,他安排光头强去砍树。树林里有N棵树,为了保护环境,不能将一个树完全砍掉,会留出一部分,因为这样树还可以继续生长。光头强将他的砍树装置的锯片高度设置为H米,这样可以锯掉所有的树比H高的部分。求在得到M米木材的前提下,H的最大值。
比如,一共有4棵树,高度分别为20、15、8、17,需要6米的木材,若将锯片的高度设置为15米,这样可以得到的木材为5+0+0+2=7米,若锯片的高度提高1米,设置为16米,只能得到木材的长度4+1=5。为了得到6米的木材,锯片的高度最大只能设置为15米。
输入
第一行,两个整数N和M。
第二行,N个整数,表示每棵树的高度
输出
一个整数,意义如上所述。
输入样例 1复制
4 6 20 15 8 17
输出样例1复制
15
提示
数据范围/约定
1<=N<=100000
1<=M<2^31
保证所有树的总长度不小于M
不要被数据范围吓到,这就是普通二分
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000010],ans;
bool check(int x){
long long he=0;
for(int i=1;i<=n;i++){
he=he+max(0,a[i]-x);
}
return he>=m;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=0,r=2000000000,mid;
while(l<=r){
mid=l+(r-l)/2;
if(check(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans<<endl;
return 0;
}
6.取数 【max】
描述
盒子里面有N个球,每个球上都有一个数,你每次可以取走一个球,这个球上的数是x,你就可以得到x的分值,若还有其他的球上的数值也是x,你可以将这些球一起取走, 但同时就有一个限制: 其他的球,若上面的数为x-1或x+1的话就不能被取了,相当于这些球被剔除。求你能取得的最大分值。
输入
第一行,一个整数N
第二行,N个整数,为球上的数值xi
输出
输出一行,为一个整数,意义如题所述。
输入样例 1复制
5 5 3 5 3 4
输出样例1复制
16
提示
数据范围/约定
1<=N<=1000000
1<=xi<= 1000000
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,t,cnt[N],maxt;
long long f[N];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>t;
cnt[t]++;
maxt=max(maxt,t);
}
f[1]=cnt[1];
f[2]=max(cnt[1],cnt[2]*2);
for(int i=1;i<=maxt;i++){
f[i]=max(f[i-1],f[i-2]+cnt[i]*i);
}
cout<<f[maxt];
}
纯模拟