音乐游戏
【遇到的问题】
一眼看去非常简单,但就是过不去。
无论是scanf(),string,getchar(),还是不同位置的缓存清楚,都一直WA,
但又觉得哪都没错(这么简单能错在哪?)
最后抱着试一试的心态,把 ios::sync_with_stdio(false); cin.tie(0); 这两行注释掉了;
然后……
就AC了……(T_T) 一个多小时啊 (╯▔皿▔)╯
传送门:C++中ios::sync_with_stdio(false); 与 getchar() 不能同时使用的原因
AC代码
#include <bits/stdc++.h>
using namespace std;
int main(){
// ios::sync_with_stdio(false);
// cin.tie(0);
int n; cin>>n;
int cnt=0;
char c;
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=6;j++){
c=getchar();
if(c=='-') cnt++;
}
getchar();
}
cout<<cnt<<endl;
return 0;
}
公交线路
【遇到的问题】
1、题目没读好,没去想 ≤|x-y| 的含义;导致有了多余的想法(比如:做到总站,又返回(这又涉及到两种情况));
2、没带纸笔,从公司到家的方向总是不明朗;
3、知道可以通过字符串匹配,但是一开始的处理是把主串翻转(默认回家方向向右,若向左,则反转);后来反应过来有更清晰明朗的写法┭┮﹏┭┮
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N=100;
bool Judge(string sub,string temp,string cmp){
return (temp.find(sub)!=-1 && cmp.find(sub)!=-1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,x,y;
int k[N],p[N];
string temp=""; //正确主串
string sub=""; //子串
string cmp=""; //错误主串
//子串分别匹配两个主串,当且仅当(正确主串匹配正确,且错误主串匹配错误),方向才正确
cin>>n>>x>>y;
for(int i=1;i<=n;i++) cin>>k[i];
if(x<y){ //右方向
for(int i=x+1;i<=y;i++) temp+=k[i]+'0';
for(int i=x-1;i>=0;i--) cmp+=k[i]+'0';
}else{ //左方向
for(int i=x-1;i>=y;i--) temp+=k[i]+'0';
for(int i=x+1;i<=n;i++) cmp+=k[i]+'0';
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>p[i];
sub+=p[i]+'0';
}
if(Judge(sub,temp,cmp)){
cout<<"Unsure"<<endl;
}else{
if(temp.find(sub)!=-1) cout<<"Right"<<endl;
else cout<<"Wrong"<<endl;
}
return 0;
}
修建道路
【遇到的问题】
没仔细看 max(a[k]), (k∈[i,j])
首先想到的是:1-n中的最大值 + 2-n中的最大值 + … +
当然这个一开始就被PASS了;
最大的问题是,题目对数组 a[ ] 没有解释(我认为);
现在感觉应该指的是,如果两两相邻村庄之间修建道路,那么就需要的花费;(可是 a [ ] 的数据个数是n,不是n-1 (・∀・(・∀・(・∀・*)……)
所以,不要纠结啦,直接当作求每个点连通后满足条件的最小权值和吧(●ˇ∀ˇ●)
啊哈哈哈哈(ˉ▽ˉ;)…
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N=200010;
typedef long long ll;
ll a[N];
/*
主要:最开始没看懂题意,也没好好揣摩max的含义
自己做的话应该会陷入到动态规划里,
因为这句话“ max(i≤k≤j){ak} ”;
图形想得正确,啊,其实自己也能做出来
*/
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n; cin>>n;
ll ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=2;i<=n;i++){
ans+=max(a[i],a[i-1]);
}
cout<<ans<<endl;
return 0;
}
3G网络
【解决】
一开始是数学推导,但,哦豁 (○´・д・)ノ 又是平方又是和又是交集的,这怎么证明(〃>目<)
其实自己陷入了严谨推导的误区里;
这里完全可以采用无限逼近的思想(题目还给你提示了……)
耍一个小聪明 (●’◡’●) 观察可以发现,答案就是 n 的倒数~ o( ̄▽ ̄)o
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n; cin>>n;
int x,y;
for(int i=0;i<n;i++) cin>>x>>y;
printf("%.10lf\n",(double)1/n);
return 0;
}
驾驶卡丁车
【解决】
1、与 BFS 思想一样,但实现简单 ┭┮﹏┭┮
2、方向的处理:一是可以利用 1-8;二是利用 +7)%8 或 +1)%8;
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int n,m,q,x,y;
string s;
int mp[N][N];
struct node{
int x,y;
};
struct node path[8]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
// (+7)%8 向左偏
// (+1)%8 向右偏
int check(int dir){
if(dir==1 || dir==3 || dir==5 || dir==7){
if(mp[x+path[(dir+7)%8].x][y+path[(dir+7)%8].y]==1 &&
mp[x+path[(dir+1)%8].x][y+path[(dir+1)%8].y]==1)
return 1;
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s;
for(int j=0;j<m;j++){
if(s[j]=='.') mp[i][j+1]=0;
else if(s[j]=='#') mp[i][j+1]=1;
else{
mp[i][j+1]=0;
x=i,y=j+1;
}
}
}
cin>>q; cin>>s;
int v=0,dir=0;
for(int step=0;step<q;step++){
bool is_ok=true;
if(s[step]=='L') dir=(dir+7)%8;
else if(s[step]=='R') dir=(dir+1)%8;
else if(s[step]=='U') v++;
else if(s[step]=='D') v=max(v-1,0);
int xx,yy;
for(int i=1;i<=v;i++){
yy=y+path[dir].y;
xx=x+path[dir].x;
if(mp[xx][yy] || xx<=0 || yy<=0 || xx>n || yy>m || check(dir)){
cout<<"Crash! "<<x<<" "<<y<<endl;
v=0;
is_ok=false;
break;
}
x=xx,y=yy;
}
if(is_ok) cout<<x<<" "<<y<<endl;
}
return 0;
}
WA代码(但是找不出bug)
我反正是不想找了(De了一天了 凸(艹皿艹 ) ),要是大家愿意帮我也是不错的嗷 U•ェ•*U文章来源:https://www.toymoban.com/news/detail-430628.html
#include <bits/stdc++.h>
using namespace std;
const int N=60;
char map_[N][N];
int n,m,q;
int x,y,v;
int drt=1;
// 1 2 3 4 5 6 7 8
//上 右上 右 右下 下 左下 左 左上
void DirctionJudge(char fx){
if(fx=='L'){
drt==1 ? drt=8:--drt;
}else{
drt==8 ? drt=1:++drt;
}
}
void Move(){
if(drt==1) x-=v;
else if(drt==2) x-=v,y+=v;
else if(drt==3) y+=v;
else if(drt==4) x+=v,y+=v;
else if(drt==5) x+=v;
else if(drt==6) x+=v,y-=v;
else if(drt==7) y-=v;
else if(drt==8) x-=v,y-=v;
}
bool IsCrash(int tx,int ty){
if(drt==1){
if(v)
for(int i=tx;i>=x;i--){
if(map_[i][ty]=='#'){
x=i+1,y=ty;
v=0;
return true;
}
if(i<1){
x=1;
v=0;
return true;
}
}
return false;
}else if(drt==2){
if(v)
for(int i=tx,j=ty;i>x && j<y;i--,j++){
if((map_[i-1][j]=='#' && map_[i][j+1]=='#')||map_[i-1][j+1]=='#'){
x=i,y=j;
v=0;
return true;
}
if(i<1 && j>m){
x=1,j=m;
v=0;
return true;
}else if(i<1){
x=1,y=j;
v=0;
return true;
}else if(j>m){
x=i,y=m;
v=0;
return true;
}
}
return false;
}else if(drt==3){
if(v)
for(int i=ty;i<=y;i++){
if(map_[tx][i]=='#'){
x=tx,y=i-1;
v=0;
return true;
}
if(i>m){
y=m;
v=0;
return true;
}
}
return false;
}else if(drt==4){
if(v)
for(int i=tx,j=ty;i<x && j<y;i++,j++){
if((map_[i+1][j]=='#' && map_[i][j+1]=='#')||map_[i+1][j+1]=='#'){
x=i,y=j;
v=0;
return true;
}
if(i>n && j>m){
x=n,y=m;
v=0;
return true;
}else if(i>n){
x=n,y=j;
v=0;
return true;
}else if(j>m){
x=i,y=m;
v=0;
return true;
}
}
return false;
}else if(drt==5){
if(v)
for(int i=tx;i<=x;i++){
if(map_[i][ty]=='#'){
x=i-1,y=ty;
v=0;
return true;
}
if(i>n){
x=n;
v=0;
return true;
}
}
return false;
}else if(drt==6){
if(v)
for(int i=tx,j=ty;i<x && j>y;i++,j--){
if((map_[i+1][j]=='#' && map_[i][j-1]=='#')||map_[i+1][j-1]=='#'){
x=i,y=j;
v=0;
return true;
}
if(i>n && j<1){
x=n,y=1;
v=0;
return true;
}else if(i>n){
x=n,y=j;
v=0;
return true;
}else if(j<1){
x=i,y=1;
v=0;
return true;
}
}
return false;
}else if(drt==7){
if(v)
for(int i=ty;i>=y;i--){
if(map_[tx][i]=='#'){
x=tx,y=i+1;
v=0;
return true;
}
if(i<1){
y=1;
v=0;
return true;
}
}
return false;
}else if(drt==8){
if(v)
for(int i=tx,j=ty;i>x && j>y;i--,j--){
if((map_[i][j-1]=='#' && map_[i-1][j]=='#')||map_[i-1][j-1]=='#'){
x=i,y=j;
v=0;
return true;
}
if(i<1 && j<1){
x=1,y=1;
v=0;
return true;
}else if(i<1){
x=1,y=j;
v=0;
return true;
}else if(j<1){
x=i,y=1;
v=0;
return true;
}
}
return false;
}
return false;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>map_[i][j];
if(map_[i][j]=='*'){
x=i, y=j;
map_[i][j]='.';
}
}
cin>>q;
string op; cin>>op;
int idx=0;
while(q--){
int tx=x,ty=y;
if(op[idx]=='L'){
DirctionJudge('L');
}else if(op[idx]=='R'){
DirctionJudge('R');
}else if(op[idx]=='U'){
v++;
}else{
v=max(v-1,0);
}
Move();
idx++;
// cout<<"起始点:("<<tx<<","<<ty<<")"<<endl;
// cout<<"方向="<<drt<<endl;
// cout<<"移动"<<v<<"格"<<endl;
// cout<<"现在点:("<<x<<","<<y<<")"<<endl;
if(IsCrash(tx,ty)){
cout<<"Crash! "<<x<<" "<<y<<endl;
}else{
cout<<x<<" "<<y<<endl;
}
}
return 0;
}
想记录的 (●ˇ∀ˇ●)
(1)审题一定要仔细!一定要纸笔 ┭┮﹏┭┮
(2)C++输入输出流;
(3)BFS;方向表示;
(4)小聪明之找规律;文章来源地址https://www.toymoban.com/news/detail-430628.html
到了这里,关于2021女生赛——5道基础题整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!