课后作业-2025-10-12
题目:P5082 成绩
网址:https://www.luogu.com.cn/problem/P5082
思路:我们定义一个a数组来存储每门科目的满分,b数组来存储每门科目的分数。那么v1就等于(a[1]+a[2]+a[3]+.....+a[n])*3。那么v2就等于(b[1]+b[2]+b[3]+.....+b[n])*2。v3就等于(a[1]-b[1]+a[2]-b[2]+a[3]-b[3]+.....+a[n]-b[n])。
知识点:简单模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+100;
long long a[maxn],b[maxn];
int main() {int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++){cin>>b[i];}long long v1=0;for(int i=1;i<=n;i++){v1+=a[i];}v1*=3;long long v2=0;for(int i=1;i<=n;i++){v2+=b[i];}v2*=2;int v3=0;for(int i=1;i<=n;i++){v3+=a[i]-b[i];}double ans=(v1-v2)/(double)v3;cout<<fixed<<setprecision(6)<<ans; return 0;
}
题目:P1749 [入门赛 #19] 分饼干 II
网址:https://www.luogu.com.cn/problem/P1749
思路:每名小朋友至少拿到一块饼干,老师想让每名小朋友拿到的饼干数量都不一样多,我们就可以求出最少需要多少饼干才能满足要求,也就是第一名同学1个饼干、第二名同学2个饼干、第三名同学3个饼干.....第k个同学k个饼干,也就是一共最少需要need=(1+2+3+...+k)=(1+k)*k/2个饼干。如果n大于等于need的话,那么多出来的我们直接全给最后一名同学就行,如果n小于k的话,那么就一定是不满足的。
知识点:等差数列求和。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
void solve()
{long long n,k;cin>>n>>k;long long need=(1+k)*k/2;if(need>n){cout<<"No"<<'\n';}else cout<<"Yes"<<'\n';
}
int main() {int T;cin>>T;while(T--)solve(); return 0;
}
题目:P1830 轰炸III
网址:https://www.luogu.com.cn/problem/P1830
思路:我们先把x次轰炸的范围用数组保存下来。对于一个关键点,我们倒叙枚举最后一次满足的轰炸,并记录一共有多少次轰炸满足。
知识点:模拟,倒序枚举。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
int X1[110],Y1[110],X2[110],Y2[110];
int main() {int n,m,x,y;cin>>n>>m>>x>>y;for(int i=1;i<=x;i++){cin>>X1[i]>>Y1[i]>>X2[i]>>Y2[i]; }while(y--){int posx,posy;cin>>posx>>posy;int ans=-1;int cnt=0;for(int i=x;i>=1;i--){if(X1[i]<=posx&&X2[i]>=posx&&Y1[i]<=posy&&Y2[i]>=posy){cnt++;if(ans==-1)ans=i;}}if(ans==-1){cout<<"N"<<'\n';}else{cout<<"Y "<<cnt<<" "<<ans<<'\n';}}return 0;
}
题目:P1838 三子棋I
网址:https://www.luogu.com.cn/problem/P1838
思路:我们定义一个二维数组a来记录它们下棋的情况,小a下的棋标注为1,小u下的棋标注为2。
那么我们首先看一下,哪几种情况是赢得情况。
x | x | x |
x | x | x |
x | x | x |
x | ||
x | ||
x |
x | ||
x | ||
x |
x | ||
x | ||
x |
x | ||
x | ||
x |
x | ||
x | ||
x |
也就是有上面8种情况是赢得情况。我们每下一步棋就判断一下谁赢就行。
知识点:模拟。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;int a[5][5];
int check(int v)
{for(int i=0;i<=2;i++){int cnt=0;for(int j=0;j<=2;j++){if(a[i][j]==v)cnt++;}if(cnt==3)return 1;}for(int j=0;j<=2;j++){int cnt=0;for(int i=0;i<=2;i++){if(a[i][j]==v)cnt++;}if(cnt==3)return 1;}int cnt=0;for(int i=0,j=0;i<=2&&j<=2;i++,j++){if(a[i][j]==v)cnt++;}if(cnt==3)return 1;cnt=0;for(int i=0,j=2;i<=2&&j>=0;i++,j--){if(a[i][j]==v)cnt++;}if(cnt==3)return 1;return 0;}
int main() {string s;cin>>s;int n=s.length();for(int i=0;i<n;i++){int pos=s[i]-'0';pos--;int x=pos/3;int y=pos%3;if(i%2==0){a[x][y]=1;}else a[x][y]=2;if(check(1)){cout<<"xiaoa wins.";return 0;}else if(check(2)){cout<<"uim wins.";return 0;}} cout<<"drew.";//539128647return 0;
}