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;
}