- C20250070's blog
2022.12.5作业题解
- 2022-12-10 21:11:59 @
一年后你也会发现其实真的很水
0.前置知识:
代码中 是 的简写(编译也能成功并且效果相同)
1.A1110
从前向后枚举并比对即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n;
scanf("%lld",&n);
ll a[n+1];
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
ll p,ans=-1;
scanf("%lld",&p);
for(ll i=1;i<=n;i++) if(a[i]==p){ans=i;break;}
printf("%lld",ans);
}
2.A1107
开一个数组 ,其中 表示 的位置上有没有种树, 表示没有, 表示有。模拟即可。
代码:
#include <iostream>
using namespace std;
int main(){
int n,m,x,y,ans=0;
cin>>n>>m;
int a[n+1]={0};
for(int i=0;i<m;i++){
cin>>x>>y;
for(int j=x;j<=y;j++){
a[j]=1;
}
}
for(int i=0;i<=n;i++){
if(a[i]==0) ans++;
}
cout<<ans;
}
3.A1118
先用数组 ,,, 记录下输入的数据。询问时从后向前枚举地毯,如果这个地毯在覆盖了这个点,输出并结束程序即可。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int a[10001],b[10001],g[10001],k[10001];
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d",&a[i],&b[i],&g[i],&k[i]);
}
int x,y;
scanf("%d%d",&x,&y);
int ans=0;
for(int i=0;i<n;i++)
{
if(a[i]<=x&&a[i]+g[i]>=x&&b[i]<=y&&b[i]+k[i]>=y)ans=i+1;
}
if(ans==0)cout<<-1<<endl;
else cout<<ans<<endl;
}
return 0;
}
4.A1124
将第一个矩阵存入数组 ,输入第二个矩阵时累加并输出即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,m;
scanf("%lld %lld",&n,&m);
ll a[n+1][m+1],x;
for(ll i=1;i<=n;i++) for(ll j=1;j<=m;j++) scanf("%lld",&a[i][j]);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
scanf("%lld",&x);
printf("%lld ",x+a[i][j]);
}
printf("\n");
}
}
5.作业
1.P1039
这题就记录一个 数组,其中 表示原数组中 出现的次数即可。
下面代码:偷懒就写快速排序了
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[1000001];
int main(){
cin>>n;
for(ll i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(ll i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
2.P1332
正常输入后从后往前输出即可。
下面代码我又偷懒用了 中的栈
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n;
cin>>n;
stack<ll> st;
for(ll i=1;i<=n;i++){
ll x;
cin>>x;
st.push(x);
}
while(!st.empty()){
cout<<st.top()<<" ";
st.pop();
}
return 0;
}
3.P1333
从前向后枚举并比对即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,x;
int main(){
cin>>n>>x;
for(ll i=1;i<=n;i++){
ll p;
cin>>p;
if(p==x){
cout<<i<<endl;
return 0;
}
}
cout<<0;
return 0;
}
4.P1334
从第二个数输出到最后再输出第一个数就行了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n;
cin>>n;
ll p;
cin>>p;
for(ll i=1;i<n;i++){
ll k;
cin>>k;
cout<<k<<" ";
}
cout<<p;
return 0;
}
5.P1335
从前向后比对并删除第一个。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,x;
cin>>n>>x;
bool flag=true;//记录当前是否没出现过x
for(ll i=1;i<=n;i++){
ll p;
cin>>p;
if(!flag||x!=p) cout<<p<<" ";//如果之前出现过x了或者这个值和x不同
else flag=false;
}
}
6.P1336
每一个进行比对,不等就输出。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,x;
cin>>n>>x;
for(ll i=1;i<=n;i++){
ll p;
cin>>p;
if(x!=p) cout<<p<<" ";
}
}
7.P1337
先输出前面不变的,在输出插入的,最后把后面的全输出完就可以了。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll n,x,p,k;
cin>>n>>p>>x;
for(ll i=1;i<=p;i++){
cin>>k;
cout<<k<<" ";
}
cout<<x<<" ";
for(ll i=p+1;i<=n;i++){
cin>>k;
cout<<k<<" ";
}
}
8.P1340
把每个月的天数先存到数组里,最后输出就好。
#include<bits/stdc++.h>
using namespace std;
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int m;
cin>>m;
cout<<day[m];
return 0;
}
9.P1341
同样的,从中间输出到后面,有正中间的就输出,最后输出前面的。
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int len=s.length();
if(len%2){
int mid=len/2;
for(int i=mid+1;i<len;i++) cout<<s[i];
cout<<s[mid];
for(int i=0;i<mid;i++) cout<<s[i];
}
else{
int mid=len/2;
for(int i=mid;i<len;i++) cout<<s[i];
for(int i=0;i<mid;i++) cout<<s[i];
}
}
10.P1342
同样开一个数组记录每一个字母出现的次数。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll p[26];
int main(){
string s;
getline(cin,s);
//s.length()就是长度
for(ll i=0;i<s.length();i++){
if(s[i]>='a'&&s[i]<='z') p[s[i]-'a']++;
//如果是小写字母就加上相应的,s[i]-'a'就是对应的ASCII码,比如'a'-'a'=0,'b'-'a'=1,'c'-'a'=2......
else if(s[i]>='A'&&s[i]<='Z') p[s[i]-'A']++;//大写字母
}
for(ll i=0;i<26;i++){
if(p[i]){
cout<<char(i+'a')<<" "<<p[i]<<endl;
}
}
}
11.P1343
使用指针, 表示当前 数组的处理进度, 表示当前 数组的处理进度。此时 为 数组中最小的, 为 数组中最小的(因为 数组和 数组是有序的)。那么当前最小的那个值一定在 和 中,比较输出即可,不要忘了 或 。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[1000001],b[1000001];
int main(){
ll n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i];
for(ll i=1;i<=m;i++) cin>>b[i];
ll x=1,y=1;
ll i,j;
while(x+y!=n+m+2){
if(x<=n) i=a[x];
else i=0x3f3f3f3f3f3f3f3f;
if(y<=m) j=b[y];
else j=0x3f3f3f3f3f3f3f3f;
if(i<=j){
cout<<i<<" ";
x++;
}
else{
cout<<j<<" ";
y++;
}
}
}
12.P1343
考虑暴力枚举。枚举 ,如果 (也就是最理想的状态, 且此时 最大也就是 ) 当前最优解,直接结束循环(因为这不可能是最优解或是并列的最优解)。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[1000001];
int main(){
scanf("%lld",&n);
ll ans=-0x3f3f3f3f3f3f3f3f;
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
for(ll i=1;i<n;i++){
if(a[i]*(n-i+1)>ans) for(ll j=i+1;j<=n;j++) ans=max(ans,min(a[i],a[j])*(j-i));
}
printf("%lld",ans);
}
嗨呀终于写完了