A - Water Station
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n;
cin>>n;
int a,b;
for(int i=n;;i++){
if(i%5==0){
a=i;
break;
}
}
for(int i=n;;i--){
if(i%5==0){
b=i;
break;
}
}
if(a-n<=n-b) cout<<a<<endl;
else cout<<b<<endl;
return 0;
}
B - ABCDEFG
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[10];
int main()
{
//预处理
a[1]=0;
a[2]=a[1]+3;
a[3]=a[2]+1;
a[4]=a[3]+4;
a[5]=a[4]+1;
a[6]=a[5]+5;
a[7]=a[6]+9;
char p,q;
cin>>p>>q;
int m=p-'A'+1;
int n=q-'A'+1;
// cout<<m<<endl;
// cout<<n<<endl;
cout<<abs(a[n]-a[m])<<endl;
return 0;
}
C - Snuke the Cookie Picker
数据比较小,可以纯模拟,暴力求解
一开始先确定矩形的范围,然后就在这个矩形中查找就行了
但是写代码的时候出现了问题
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=510;
char s[N][N];
int main()
{
int h,w;
cin>>h>>w;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>s[i][j];
}
}
int x1,y1;
bool flag1=false;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
if(s[i][j]=='#'){
x1=i;
y1=j;
flag1=true;
break;
}
}
if(flag1) break;
}
// cout<<x1<<" "<<y1<<endl;
int x2,y2;
bool flag2=false;
for(int i=h;i>=1;i--){
for(int j=w;j>=1;j--){
if(s[i][j]=='#'){
x2=i;
y2=j;
flag2=true;
break;
}
}
if(flag2) break;
}
// cout<<x2<<" "<<y2<<endl;
int x,y;
bool flag=false;
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(s[i][j]=='.'){
x=i;
y=j;
flag=true;
break;
}
}
if(flag) break;
}
cout<<x<<" "<<y<<endl;
return 0;
}
以上代码问题在于想确定矩形的左上角和右下角,但是忽略了左上角或者右下角有可能没有饼干的情况,如果出现了这两种特殊情况,那么矩形范围就确定错了,可以单独处理这两种情况
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=510;
char s[N][N];
int main()
{
int h,w;
cin>>h>>w;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
cin>>s[i][j];
}
}
int x1,y1;
bool flag1=false;
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
if(s[i][j]=='#'){
x1=i;
y1=j;
flag1=true;
break;
}
}
if(flag1) break;
}
if(x1<h&&y1>1){
if(s[x1+1][y1-1]=='#'){
cout<<x1<<" "<<y1-1<<endl;
return 0;
}
}
// cout<<x1<<" "<<y1<<endl;
int x2,y2;
bool flag2=false;
for(int i=h;i>=1;i--){
for(int j=w;j>=1;j--){
if(s[i][j]=='#'){
x2=i;
y2=j;
flag2=true;
break;
}
}
if(flag2) break;
}
if(x2>1&&y2<w){
if(s[x2-1][y2+1]=='#'){
cout<<x2<<" "<<y2+1<<endl;
return 0;
}
}
// cout<<x2<<" "<<y2<<endl;
int x,y;
bool flag=false;
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(s[i][j]=='.'){
x=i;
y=j;
flag=true;
break;
}
}
if(flag) break;
}
cout<<x<<" "<<y<<endl;
return 0;
}
D - Sleep Log
参考叶梦璃愁
二分用于快速查找需要找到的位置
比如对于[480,1920]这个区间,我们进行二分,我们会在1到n之间二分,最终会找到2这个位置
同理,找到6这个位置,总之找到它左边(包含它)的第一个位置
前缀和,为后续算查询区间内的睡眠时间
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
int s[N];
int res;
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//前缀和,表示到该点的睡眠时间(并不严格,只要是在睡着的区间内,该区间的两端点就都算是该睡眠时间)
for(int i=1;i<=n;i++){
if(i%2==0) s[i]=s[i-1]+a[i+1]-a[i];
else s[i]=s[i-1];
}
int q;
cin>>q;
while(q--){
int x,y;//查询的区间
cin>>x>>y;
int l=1,r=n;
while(l<r){
int mid=(l+r+1)/2;
if(a[mid]<=x) l=mid;
else r=mid-1;
}
int xx=l;//二分找到的数组a的值小于等于x的左边第一个位置(取值为1到n)
l=1,r=n;
while(l<r){
int mid=(l+r+1)/2;
if(a[mid]<=y) l=mid;
else r=mid-1;
}
int yy=l;//二分找到的数组a的值小于等于y的左边第一个位置(取值为1到n)
//算出查询区间内的睡眠时间,不要忘记还要处理一些细节
res=s[yy]-s[xx-1];
if(xx%2==0) res-=(x-a[xx]);
if(yy%2==0) res-=(a[yy+1]-y);
cout<<res<<endl;
}
return 0;
}