这次比赛主要的问题是用两层for循环的时候总是把里层的j写成i然后跑不了程序找半天错。
刚开始13分,没注意到一句话中可能出现一个以上的"chi1 huo3 guo1",题目只说对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1。
没注意到字符串B也是由ASCII码和空白字符组成,要用getline,没得满分
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n,tree[31];
void create(int i)
{
if(i>n)return;
create(2*i);
create(2*i+1);
cin>>tree[i];
}
int main()
{
cin>>n;
create(1);
for(int i=1;i<=n;i++)
{
if(i>1)cout<<" ";
cout<<tree[i];
}
cout<<endl;
}
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
int n,m;
cin>>n>>m;
int a[n+1][n+1];//要定义一个二维数组存放边和路费
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
a[i][j]=0;
}
}
for(int i=0;i<m;i++)
{
int b,c,d;
cin>>b>>c>>d;
a[b][c]=d;
a[c][b]=d;
}
int k;
cin>>k;
ll mn=1e9;//注意总路费最大是1e9
int mnn=0,ff=0;//mnn是花费最少的有效攻略序号
for(int i=0;i<k;i++)
{
int nn;
cin>>nn;
int x,s=0;
cin>>x;
int q[n+1]={0};//用来标记网红点,判断是不是有效攻略
q[x]=1;
int f=1;
if(a[0][x]==0)f=0;//要注意判断从家到第一个点是否有边
s+=a[0][x];//从家到第一个点的路费
for(int j=1;j<nn;j++)
{
int y;
cin>>y;
if(q[y]==1)
{
f=0;//这里的f标记是否有多余的点
}
else q[y]=1;
if(a[x][y]==0)f=0;//这里的f判断是否存在路径
else s+=a[x][y];
x=y;
if(j==nn-1&&a[y][0]==0)f=0;//这里的f判断是否存在路径
if(j==nn-1)s+=a[nn-1][0];
}
for(int j=1;j<=n;j++)
{
if(q[j]!=1)f=0;//这里的f判断点是否足够
}
if(f==1)ff++;
if(mn>s&&f!=0)
{
mn=s;
mnn=i+1;
}
//cout<<i+1<<" "<<f<<endl;
}
cout<<ff<<endl;
cout<<mnn<<" "<<mn<<endl;
}
补充
gcd函数
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
C++万能头文件的代码中用__gcd(n,m)函数也可以直接用来求最大公约数