1.A 国际旅行1
因为是从第一个国家到第 k少的国家,且保证各个国家之间可以相互到达,且m>=n-1 那么说明这些国家是连在一起的,我们可以用一个数组存储,把这些国家存里面最后再排序
#include<bits/stdc++.h>
using namespace std;
int x[1005];
int a[1005],b[1005];
int main(){
ios::sync_with_stdio,cin.tie(0),cout.tie(0);
int m,n,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int u,v,j=1;
for(int i=1;i<=m;i++){
cin>>u>>v;
if(!x[u]){
b[j++]=a[u];
x[u]=1;
}
if(!x[v]){
b[j++]=a[v];
x[v]=1;
}
}
sort(b+1,b+j);
int i;
while(q--){
cin>>i;
cout<<b[i]<<endl;
}
}
2. J 这是签到
这题可以直接用行列式公式进行计算,因为数组最大为 5*5的,所以可以把所有计算列出来,行列式计算方法为 1内元素相乘+ 2内元素相乘+3内元素相乘+...5内元素相乘
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
#define fi first
#define se second
#define PII pair<int,int>
#define lowbit(x) ((x)&(-x))
#define ULL unsigned long long
using namespace std;
const int N=1e4+5;
int a[10][10];
void solve(){
int n,m;
cin >> n >> m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
cin >> a[i][j];
}
int minn=a[1][1];
if(n==1&&m==1){
cout << minn << endl;
return ;
}
int k=a[1][1]*a[2][2]-a[1][2]*a[2][1];
minn=min(k,minn);
if(n<=2&&m<=2){
cout << minn << endl;
return ;
}
int k1=a[1][1]*a[2][2]*a[3][3]+a[1][2]*a[2][3]*a[3][1]+a[1][3]*a[2][1]*a[3][2];
int k2=a[1][3]*a[2][2]*a[3][1]+a[1][1]*a[2][3]*a[3][2]+a[1][2]*a[2][1]*a[3][3];
minn=min(minn,k1-k2);
if(n<=3&&m<=3){
cout << minn << endl;
return ;
}
k1=a[1][1]*a[2][2]*a[3][3]*a[4][4]+a[1][2]*a[2][3]*a[3][4]*a[4][1]+a[1][4]*a[2][1]*a[3][2]*a[4][3]+a[1][3]*a[2][4]*a[3][1]*a[4][2];
k2=a[1][4]*a[2][3]*a[3][2]*a[4][1]+a[1][1]*a[2][4]*a[3][3]*a[4][2]+a[1][3]*a[2][2]*a[4][4]*a[3][1]+a[1][2]*a[2][1]*a[3][4]*a[4][3];
minn=min(minn,k1-k2);
if(n<=4&&m<=4){
cout << minn << endl;
return ;
}
k1=a[1][1]*a[2][2]*a[3][3]*a[4][4]*a[5][5]+a[1][2]*a[2][3]*a[3][4]*a[5][1]*a[4][5]+a[1][5]*a[2][1]*a[3][2]*a[4][3]*a[5][4]+a[1][3]*a[2][4]*a[3][5]*a[4][1]*a[5][2]+a[1][4]*a[2][5]*a[3][1]*a[4][2]*a[5][3];
k2=a[1][5]*a[2][4]*a[3][3]*a[4][2]*a[5][1]+a[1][1]*a[2][5]*a[3][4]*a[4][3]*a[5][2]+a[1][4]*a[2][3]*a[5][5]*a[3][2]*a[4][1]+a[1][2]*a[2][1]*a[3][5]*a[4][4]*a[5][3]+a[1][3]*a[2][2]*a[3][1]*a[4][5]*a[5][4];
minn=min(minn,k1-k2);
cout << minn << endl;
return ;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t=1;
//cin >> t;
while(t--) solve();
// cout << fixed;//强制以小数形式显示
// cout << setprecision(n); //保留n位小数
return 0;
}
3.H 狼狼的备忘录
这题就是一个大模拟题,刚开始用的结构体出现了各种各样的错误,而且有点逻辑不清晰,看来还是要多练练逻辑,用一个map存数据,因为map内部自动排序,比较方便。我们只需要判断有没有重复的后缀
#include<bits/stdc++.h>
using namespace std;
map<string,vector<string> > q;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
string s;
cin>>s;
int t;
cin>>t;
while(t--){
string a;
cin>>a;
string tm=a;
reverse(tm.begin(),tm.end());
int f=0;
for(int j=0;j<q[s].size();j++){
string tt=q[s][j];
reverse(tt.begin(),tt.end());
int fg=0;
for(int k=0;k<min(tm.size(),tt.size());k++){
if(tm[k]!=tt[k]) fg=1;
}
if(fg==0){
f=1;
if(tt.size()<tm.size()){
q[s][j]=a;
}
}
}
if(f==0) q[s].push_back(a);
}
}
cout<<q.size()<<endl;
for(auto i:q){
cout<<i.first<<' ';
vector<string> res=i.second;
sort(res.begin(),res.end());
unique(res.begin(),res.end());
cout<<res.size()<<' ';
for(auto j:res){
cout<<j<<' ';
}
cout<<endl;
}
}