测试总结8/6

1.签到

判断其大小写是否与之相等

#include<bits/stdc++.h>
using namespace std;
long long t,x,y;
int ans,n,m,k=0;
const int N=2e5+7;
int s[N];
string sum;
string num="CodeForces";
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		cin>>sum;
		int t=0;
		for(int j=0; j<10; j++) {
			if(sum[j]+32==num[j]||sum[j]-32==num[j]||sum[j]==num[j])
				continue;
			else
				t++;

		}
		cout<<t<<endl;
	}

}

2.层次结构

并查集,唯一需要注意的是:每一个人只需要一个主管就好了,所有先将他们的数据按照成本进行排序,底到高,然后查询根节点并起来就好了,很明显,前面并起来的,成本肯定是低的,所有我在bing那个加了an[root2]=1,做标记。(而且必须是Qa大于Qb)

#include<bits/stdc++.h>
using namespace std;
long long t,x,y;
int ans,n,m,k=0;
const int N=2e5+7;
int s[N],sum[N],an[N];
int find(int x) {
	while(s[x]>=0)//当指针不为-1时就会一直向前搜索,直到搜索出根结点
		x=s[x];
	return x;//返回根结点的下标
}

void bing(int root1,int root2) { //并
	if(root1==root2)
		return;
	s[root2]=root1;
	an[root2]=1;
}
struct er {
	int a,b,c;
} num[N];
int cmp(er a,er c) {
	return a.c<c.c;
}
int main() {
	cin>>n;
	for(int i=1; i<=n; i++) {
		s[i]=-1;
		cin>>sum[i];
	}
	cin>>m;
	for(int i=1; i<=m; i++)
		cin>>num[i].a>>num[i].b>>num[i].c;
	sort(num+1,num+1+m,cmp);
//	for(int i=1; i<=m; i++)
//		cout<<num[i].a<<num[i].b<<num[i].c<<endl;
	for(int i=1; i<=m; i++) {
		//	cout<<i<<" "<<i<<endl;
		if(find(num[i].a)!=find(num[i].b)&&an[num[i].b]==0&&sum[num[i].a]>sum[num[i].b]) {
			bing(find(num[i].a),find(num[i].b));
			t+=num[i].c;
			//	cout<<t<<" "<<find(num[i].a)<<" "<<find(num[i].b)<<endl;
		}
	}
	for(int i=1; i<=n; i++) {
		if(s[i]==-1)k++;
		if(k==2) {
			cout<<-1;
			return 0;
		}
	}
	cout<<t;
	return 0;
}

3.熙巨打票

思维题,而且我记得以前写过,把情况都列举出来,在草稿纸上总结规律就行了(用的数据尽量小一点,方便计算)(唯一的坑就是9次方,得用long long)

#include<bits/stdc++.h>
using namespace std;
int n;
int main() {
	cin>>n;
for(int i=1;i<=n;i++){
	long long  a,b,c;
	cin>>a>>b>>c;
	if(b>=a)
	cout<<(long long)(c*b)<<endl;
	else if(n<=2)
	cout<<(long long)(c*b)<<endl;
	else {
		if(c%2==0)
		cout<<(long long)((c/2)*(a+b)+b-a)<<endl;
		else
		cout<<(long long)((c/2)*(a+b)+b)<<endl;
	}
}
	return 0;
}

4.五颜六色得豆子

不考虑时间的话肯定是很简单的,所有一直在想怎么缩短时间,奈何没想到map,还是问的别人!!!(map的特点:根据前一个可以查询后面一个,而且不允许重复,只允许一对多),很明显这里的一指的是C,他可以对应多个A。(这里的A,C是题目中给出的)

#include<bits/stdc++.h>
using namespace std;
int n,a,c;
const int N=2e5+5;
map<int,int> num;
int main() {
	cin>>n;
	int e,r;
	for(int i=1; i<=n; i++) {
		cin>>a>>c;
		if (!num[c]) {
			num[c]=a;
		} else {          //没找到
			num[c]=min(a,num[c]);
		}
	}
	for(auto sum:num) {
		e=max(e,sum.second);
	}
	cout<<e;
	return 0;
}

5.湖泊

到这里我只能说自己蠢了,忘得太多了,想的好慢,好不容易想起来,写出来了,却没经受住20多个测试点的毒打,主要还是时间不过关,改进了好几次。

#include<bits/stdc++.h>
using namespace std;
int n,m,ans,t;
const int N=1e3+5;
int a[N][N],b[N][N];
int dx[6]= {0,1,-1,0,0};
int dy[6]= {0,0,0,1,-1};
int dfs(int i,int j) {
	int num=a[i][j];
	b[i][j]=1;
	for(int t=1; t<=4; t++) {
		int x=i+dx[t],y=j+dy[t];
		if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!=0&&b[x][y]==0) {
			num+=dfs(x,y);
		}
	}
	return num;
}
int main() {
	cin>>t;
	while(t--) {
		ans=0;
		memset(b,0,sizeof(b));
		cin>>n>>m;
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=m; j++) {
				cin>>a[i][j];
			}
		}
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=m; j++) {
				if(a[i][j]!=0&&!b[i][j]) {
					ans=max(ans,dfs(i,j));
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值