- 吴易繁 的博客
七月暑期集训DAY11
- @ 2024-7-19 19:29:46
A. 小W的病毒歼灭战
题目类型:模拟
思路
像这道题目我们可以用队列,也可以用数组模拟,用一个数组来当作病毒来的顺序与种类,另一个来当作弹夹的种数,每一次输入的时候就可以来遍历弹夹,只要这个种数存在,就不用回去,否则就要回去,所以可以用一个bool类型的数组。
代码
#include<bits/stdc++.h>
using namespace std;
int a[1010],b[110],ans;
int main(){
freopen("bd.in","r",stdin);
freopen("bd.out","w",stdout);
int m,n,idx=1;
cin>>m>>n;
for(int i=1;i<=m;i++) b[i]=1010;
for(int i=1;i<=n;i++){
bool flag=0;
cin>>a[i];
for(int j=1;j<=m;j++){
if(b[j]==a[i]){
flag=1;
break;
}
}
if(flag==0){
ans++;
b[idx]=a[i];
idx++;
if(idx>m) idx=1;
}
}
cout<<ans;
return 0;
}
这道题目在写的时候没有将判断弹夹里是否有病毒种数的变量初始化,下一次一定要再细心一点。
B. 小田的三倍数
题目类型:字符串
思路
上过五年级的应该都知道,只要各位上的和是三的倍数,那这个数就是三的倍数,只要知道这个理论,这道题目就可以做出来,只不过要因为数据范围,所以要用字符串。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("three.in","r",stdin);
freopen("three.out","w",stdout);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
string a;
cin>>a;
for(int j=0;j<a.size();j++){
ans+=(a[j]-'0')%3;
ans%=3;
}
}
if(ans!=0) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}
这道题目在写的时候将Yes写成YES了,下一次一定要再细心一点。
C. 小田的省钱计划
题目类型:递推
思路
根据题目我们可以看出,其实这道题目其实就是在求一个价值最大的子序列,那么我们可以先将原价格减去x,表示超市亏了多少钱,再来求前缀和,只不过要注意,若if(s[i-1]<0) s[i]=a[i]。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N],s[N];
int main(){
freopen("money.in","r",stdin);
freopen("money.out","w",stdout);
long long n,x,ans=0;
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]-=x;
}
for(int i=1;i<=n;i++){
if(s[i-1]<0) s[i]=a[i];
else s[i]=s[i-1]+a[i];
}
for(int i=1;i<=n;i++) ans=max(s[i],ans);
cout<<ans;
return 0;
}
这道题目只想着写暴力解法,没有想优化,下一次一定要再想一下优化的解法。
D. 计算表达式的值
题目类型:栈
思路
这道题目直接套模板再写上^的情况即可。
代码
#include<bits/stdc++.h>
using namespace std;
stack<int> num;
stack<char> op;
unordered_map<char,int> sx{{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
void ys(){
char c=op.top(); op.pop();
int b=num.top();
num.pop();
int a=num.top();
num.pop();
if(c=='+') num.push(a+b);
else if(c=='-') num.push(a-b);
else if(c=='*') num.push(a*b);
else if(c=='/') num.push(a/b);
else if(c=='^'){
b--;
int x=a;
while(b--) a*=x;
num.push(a);
}
}
int main(){
freopen("bds.in","r",stdin);
freopen("bds.out","w",stdout);
string s;
cin>>s;
for(int i=0;i<s.size();i++){
auto c=s[i];
if(isdigit(c)){
int x=0,j=i;
while(j<s.size()&&isdigit(s[j])){
x=x*10+s[j]-'0';
j++;
}
i=j-1;
num.push(x);
}
else if(c=='(') op.push(c);
else if(c==')'){
while(op.top()!='(') ys();
op.pop();
}
else{
while(op.size()&&op.top()!='('&&sx[c]<=sx[op.top()]) ys();
op.push(c);
}
}
while(op.size()) ys();
cout<<num.top();
return 0;
}
这道题目在写的时候不仅将^的优先级搞错了,还求错了^的情况写错了,下一次一定要注意注意再注意。
E. 永夜的报应
题目类型:位运算
思路
仔细看这道题,我们可以发现,a^b其实是小于a+b的,那么我们可以直接将所有数都放到一个数组里面来异或。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];
int main(){
freopen("huiye.in","r",stdin);
freopen("huiye.out","w",stdout);
int n,ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
ans^=a[i];
}
cout<<ans;
return 0;
}
这道题目完全没有思路,所以就放弃了,下一次不能轻易放弃。
F. 数学题2
题目类型:数学
思路
对于这道题目,我们可以这样,先求出n的约数,用一个哈希表存起来,然后找满足条件的最大公因数即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int a[N],max_1;
unordered_map<int,int> mp;
int main(){
freopen("math2.in","r",stdin);
freopen("math2.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]!=1) mp[a[i]]++;
mp[1]++;
max_1=max(max_1,a[i]);
for(int j=2;j<=a[i]/j;j++){
if(a[i]%j==0) mp[j]++;
if(a[i]%j==0&&j!=a[i]/j) mp[a[i]/j]++;
}
}
for(int i=1;i<=n;i++){
for(int j=max_1;j>=1;j--){
if(mp[j]>=i){
max_1=j;
cout<<j<<endl;
break;
}
}
}
return 0;
}
这道题目完全没有思路,所以就放弃了,下一次不能轻易放弃。