T1小W的病毒歼灭战(队列)

题目传送门

总结(自己)

思路错了..........(我到底是多天才能想到flag标记数组啊[怒]),一部分原因是因为对第一题的蔑视(以为来打卡的)

思路

水题,队列存下弹夹,桶存下种类。秒了

附AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,t[1010],dl[1010],tt=-1,hh,ans;
int main()
{
	freopen("bd.in","r",stdin);
	freopen("bd.out","w",stdout);
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		int a;
		cin>>a;
		if(t[a]==0) dl[++tt]=a,t[a]++,ans++;
		while(tt-hh+1>m) t[dl[hh]]--,hh++;
	}
	cout<<ans;
    return 0;
}

T2小田的三倍数(数学)

题目传送门

总结(自己)

秒了

思路

各位数字之和为3则是3的倍数,氺

附AC代码

#include<bits/stdc++.h>
using namespace std;
int t,ans;
int main()
{
	freopen("three.in","r",stdin);
	freopen("three.out","w",stdout);
	cin>>t;
	while(t--)
	{
		ans=0;
		int n;
		cin>>n;
		while(n--){
			string a;
			cin>>a;
			for(int i=0;i<a.size();i++){
				ans+=a[i]-'0';
			}
		}
		if(ans%3==0) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
    return 0;
}

T3小田的省钱计划(递推)

题目传送门

总结(自己)

思路错误(我那个方法至今还未找出反例[笑])

思路

这题其实就是求最大子段和 递推写就完了

定义一个数组f[],表示以i结尾的最大子段和 然后枚举每一个位置f[i] 一共有两种情况

如果f[i-1]的值为负数,那么我肯定不用接这个数了,就以自己结尾 递推式就是f[i]=a[i]f[i]=a[i]

如果f[i-1]的值为正数,那么就将这个数接上 递推式就是f[i]=f[i1]+a[i]f[i]=f[i-1]+a[i]

推出递推式后这题随便A

附AC代码

#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],f[100010],x;
int main()
{
	freopen("money.in","r",stdin);
	freopen("money.out","w",stdout);
	cin>>n>>x;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		if(f[i-1]<0) f[i]=a[i]-x;
		else f[i]=f[i-1]+a[i]-x;
	}
	long long mix=0;
	for(int i=1;i<=n;i++)
	{
		mix=max(mix,f[i]);
	}
	cout<<mix;
    return 0;
}

T4计算表达式的值(栈)

题目传送门

* 总结(自己)*

忘模板了......(默默的复习了一遍模板[酸])

思路

套模板 改下优先级再增加个幂运算就行

附AC代码

#include<bits/stdc++.h>
using namespace std;
string a;
int tt1=-1,tt2=-1,s[100010];
char f[100010];
void js()
{
	char fh=f[tt2--];
	int s2=s[tt1--];
	int s1=s[tt1--],x;
	if(fh=='+') x=s1+s2;
	else if(fh=='-') x=s1-s2;
	else if(fh=='*') x=s1*s2;
	else if(fh=='/') x=s1/s2;
	else if(fh=='^')
	{
		x=1;
		while(s2--){
			x*=s1;
		}
	}
	s[++tt1]=x;
}
int qs(int &i)
{
	int sh=0;
	i--;
	while(a[i+1]<='9'&&a[i+1]>='0'){
		i++;
		sh=sh*10+a[i]-'0';
	}
	return sh;
}
unordered_map<char,int> yx{{'+',1},{'-',1},{'*',2},{'/',2},{'^',3}};
int main()
{
	freopen("bds.in","r",stdin);
	freopen("bds.out","w",stdout);
	cin>>a;
	for(int i=0;i<a.size();i++){
		if(a[i]<='9'&&a[i]>='0'){
			s[++tt1]=qs(i);
		}
		else if(a[i]=='(') f[++tt2]=a[i];
		else if(a[i]==')'){
			while(f[tt2]!='(') js();
			tt2--;
		}
		else{
			while(tt1>=0&&yx[a[i]]<=yx[f[tt2]]) js();
			f[++tt2]=a[i];
		}
	}
	while(tt2>=0) js();
	cout<<s[tt1];
    return 0;
}

T5永夜的报应(数学)

题目传送门

总结(自己)

没时间.....(第一眼没思路就过了) 还有之前没认真听课(自己的债自己还[哭])

思路

老师说过异或就是没有进位的加法 所以所有分一组就行

附AC代码(巨短)

#include<bits/stdc++.h>
using namespace std;
int n,ans;
int main()
{
	freopen("huiye.in","r",stdin);
	freopen("huiye.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int a;
		cin>>a;
		ans=a^ans;
	}
	cout<<ans;
    return 0;
}

T6 数学题2

题目传送门

总结(自己)

拿了50分还是挺满意的(毕竟最后十分钟),但距离对也就差个(n) \sqrt(n)的统计约数而已