noi-9月23日作业
题目:B3917 [语言月赛 202401] 小跳蛙
网址:https://www.luogu.com.cn/problem/B3917
思路:我们用一个数组p来记录每只青蛙在的位置,p[i]代表编号为i的青蛙在a数组的位置。
知识点:一维数组,小模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;int a[maxn],p[maxn];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];p[a[i]]=i;}for(int i=1;i<=n-1;i++){int now=p[i],zero=p[0];swap(a[now],a[zero]);p[a[now]]=now;p[a[zero]]=zero;}for(int i=1;i<=n;i++)cout<<a[i]<<" ";return 0;
}
题目:B3765 [语言月赛202305] 超链接
网址:https://www.luogu.com.cn/problem/B3765
思路:我们定义一个a数组来记录每个页面能够到达的页面,vis数组来记录点击两次能够到达的页面。vis[i][j]代表点击i次j是否能够到达。
知识点:一维数组,二维数组,小模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;int a[maxn][maxn];
int vis[3][maxn];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){int cnt;cin>>cnt;a[i][0]=cnt;for(int j=1;j<=cnt;j++){int x;cin>>x;a[i][j]=x;}}for(int i=1;i<=a[1][0];i++){vis[1][a[1][i]]=true;
// cout<<a[1][i]<<'\n';}for(int i=1;i<=n;i++){if(!vis[1][i])continue;for(int j=1;j<=a[i][0];j++){vis[2][a[i][j]]=true;}}vis[0][1]=true;int ans=0;for(int i=1;i<=n;i++){if(vis[1][i]||vis[2][i]||vis[0][i])ans++;}cout<<ans;return 0;
}
题目:P1190 [NOIP 2010 普及组] 接水问题
网址:https://www.luogu.com.cn/problem/P1190
思路:因为数据范围很小,所以我们按照题目的意思简单模拟一下。
知识点:while循环,小模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;int a[maxn],s[maxn];
int main(){int n,m;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}int id=1;int ans=0;while(true){if(id>n)break;for(int i=1;i<=m;i++){if(s[i]<=0){s[i]=a[id];id++;}s[i]--;}ans++;}int mx=0;for(int i=1;i<=m;i++){mx=max(mx,s[i]);}ans+=mx;cout<<ans;return 0;
}
题目:P2035 [USACO08JAN] iCow B
网址:https://www.luogu.com.cn/problem/P2035
思路:我们按照题目的意思模拟,每次找到最大的id并输出,然后进行更新操作。
知识点:双重for循环,简单模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;int a[maxn],ans[maxn];
int main(){int n,T;cin>>n>>T;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=T;i++){int mx=-10,id=0;for(int j=1;j<=n;j++){if(a[j]>mx){mx=a[j];id=j;}}ans[i]=id;a[id]=0;int x=mx/(n-1);int md=mx%(n-1);for(int j=1;j<=n;j++){if(j==id)continue;a[j]+=x;if(md){a[j]++;md--; }} } for(int i=1;i<=T;i++)cout<<ans[i]<<'\n';return 0;
}
题目:P1003 [NOIP 2011 提高组] 铺地毯
网址:https://www.luogu.com.cn/problem/P1003
思路:我们先定义四个数组,分别记录每个地毯的左下角的x坐标,左下角的y坐标,在x坐标的长度,在y坐标的长度。然后我们倒叙枚举。
知识点:倒叙枚举,简单思维。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;int X[maxn],Y[maxn],lenx[maxn],leny[maxn];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>X[i]>>Y[i]>>lenx[i]>>leny[i];}int tx,ty;cin>>tx>>ty;for(int i=n;i>=1;i--){int xx=X[i]+lenx[i],yy=Y[i]+leny[i];if(tx>=X[i]&&tx<=xx&&ty>=Y[i]&&ty<=yy){cout<<i;return 0;}}cout<<-1;return 0;
}