A-国际旅行Ⅰ_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)
题目保证各个国家之间可以相互到达;那么只用对数组从小到大排序,直接对应输出就可以;
#include<bits/stdc++.h>
using namespace std;
int num[1005];
int ans[1005];
signed main(){
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
}
sort(num+1,num+1+n);
while(q--){
int k;
cin>>k;
cout<<num[k]<<endl;
}
return 0;
}
F-水灵灵的小学弟_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)
你会发现这俩人的拼音是一样的;
#include<bits/stdc++.h>
using namespace std;
signed main(){
int t;
cin>>t;
while(t--){
int a,b;
cin>>a>>b;
cout<<"DHY"<<endl;
}
return 0;
}
I-重生之zbk要拿回属于他的一切_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)
签到题;不停地删减统计就行;
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int n;
cin>>n;
string s;
cin>>s;
int ans=0;
while(s.find("chuan")!=s.npos){
int y=s.find("chuan");
ans++;
s.erase(y,5);
}
cout<<ans<<endl;
return 0;
}
J-这是签到_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)
这题要用到线性代数的知识;
什么是逆序数,就是第i个数后边有几个比它小的,从i=1;i<=n;i++;累加上;
题目给了这个式子,就是j数组的全排列,全部排列的ans都求出来。取最小值就可了
函数N是用来计算重新排列后的数组的逆序数是多少,
模拟公式就行
#include<bits/stdc++.h>
using namespace std;
#define int long long
int mp[10][10];
int n,m;
int ans=0;
int a[10];
int maxx;
int N(int x){
int count = 0;
for (int i = 1; i <x ; i++) {
for (int j = i + 1; j <=x; j++) {
if (a[i] > a[j])
count++;
}
}
return count;
}
signed main()
{
cin>>n>>m;
maxx=max(n,m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
int sum=LLONG_MAX;
for(int i=1;i<=maxx;i++){
int u=1;
ans=0;
for(int j=1;j<=i;j++){
a[j]=j;
}
do{
u=1;
if(N(i)%2!=0)u=-1;
for(int j=1;j<=i;j++){
u*=mp[j][a[j]];
//cout<<mp[j][a[j]]<<" ";
}
// cout<<endl;
ans+=u;
}while(next_permutation(a+1,a+1+i));
//cout<<ans<<endl;
sum=min(sum,ans);
}
cout<<sum<<endl;
return 0;
}
H-狼狼的备忘录_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)
这道题我的思路是读取星座信息的时候与要存进去的数组里边的数都比较一下,存进去的数是不是数组里边任何一个数组的后缀。如果不是就存进去,此时只能保证后边输入的“后缀”不会进入到b数组里边。
因为后边可能还会有同一个人的信息需要录入,我们就对b数组从大到小进行排序,为什么从大到小,因为我输入的数是和加入进入的数进行判别,加入进去的数是不是里边的后缀。如果是从小到大,如 9 89;9是89的后缀,但是9先加进去,89不是9的后缀,就排不出来,后边d数组为什么又是从小到大呢,因为有前导0的情况,比如001 1,1是001的后缀,但是001小于1,所以c,d数组就是对这些后缀情况进行排查;
最后输出要字典序小的先输出,于是善用stl帮助你输出(set从小到大排序,还没有重复元素);
#include<bits/stdc++.h>
using namespace std;
map<string,vector<string>>a;
vector<string>b[50];
map<string,int>num;
int cnt=0;
vector<string>d[50];
vector<string>e[50];
vector<string>c[50];
bool cmp(string ff,string gg ){
return ff>gg;
}
signed main()
{
int n;
cin>>n;
while(n--){
string name;
cin>>name;
if(num[name]==0){
cnt++;
num[name]=cnt;//将名字转换成数字标号;
}
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
string str;
cin>>str;
if(b[num[name]].size()==0){
b[num[name]].push_back(str);
}
else {
int f=0;
for(auto p:b[num[name]]){
string s;
int l=p.size();
int len=str.size();
if(l>=len){
s=p.substr(l-len,len);
if(str==s){
f=1;
break;
}
}
}
if(f==0)b[num[name]].push_back(str);
}
}
}
for(int i=1;i<=cnt;i++){
sort(b[i].begin(),b[i].end(),cmp);
for(auto pp:b[i]){
//cout<<pp<<" ";
if(c[i].size()==0)c[i].push_back(pp);
else{
int f=0;
for(auto p:c[i]){
string s;
int l=p.size();
int len=pp.size();
if(l>=len){
s=p.substr(l-len,len);
if(pp==s){
f=1;
break;
}
}
}
if(f==0)c[i].push_back(pp);
}
}
//cout<<endl;
}
for(int i=1;i<=cnt;i++){
sort(b[i].begin(),b[i].end());
for(auto pp:b[i]){
//cout<<pp<<" ";
if(d[i].size()==0)d[i].push_back(pp);
else{
int f=0;
for(auto p:d[i]){
string s;
int l=p.size();
int len=pp.size();
if(l>=len){
s=p.substr(l-len,len);
if(pp==s){
f=1;
break;
}
}
}
if(f==0)d[i].push_back(pp);
}
}
//cout<<endl;
}
for(int i=1;i<=cnt;i++){
for(auto p:c[i]){
for(auto x:d[i]){
if(p==x)e[i].push_back(p);
}
}
}
for(auto p:num){
a[p.first]=e[p.second];
}
set<string>pp;
pp.clear();
cout<<a.size()<<endl;
for(auto p:a){
cout<<p.first<<" ";
cout<<p.second.size()<<" ";
pp.clear();
for(auto x:p.second){
pp.insert(x);
}
for(auto x:pp){
cout<<x<<" ";
}
cout<<endl;
}
return 0;
}
D-A*BBBB_河南萌新联赛2024第(二)场:南阳理工学院 (nowcoder.com)
最后半小时,看题的时候有点着急,我以为是两个随便的大数相乘。没想到b上的所有数字都相同。那么我们就随便找两个数, 7845*222=(7845)*2*100+7845*2*10+7845*2;
15960 00+15960 0+15960,
15960 00+15960 0+15960;
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
1 5 9 6 0 0 0
1 5 9 6 0 0
1 5 9 6 0
这里观察可知,每一列相加都等于这一列的哪一行往前累加k (k是数组b的长度);
那我们就用前缀和做;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int c[2000010];
stack<int>ans;
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while(t--){
string A,B;
cin >> A >> B;
int m = B.length();
int b = B[0]-'0';
for(int i = 1;i < m; ++i)A+="0";
int n = A.length();
reverse(A.begin(),A.end());
c[n] = 0;
for(int i = 0;i < n; ++i)c[i] = (A[i]-'0')*b;
for(int i = 1;i <= n; ++i){
c[i] += c [i-1]/10;
c[i-1]%=10;
}
if(c[n])n++;
if(!c[n-1]){
cout << 0 << endl;
continue;
}
int sum = 0;
for(int i = 0;i < m; ++i){
sum += c[i];
}
int num = sum;
ans.push(num%10);
for(int i = 0;i < n; ++i){
num /= 10;
if(i+m<n)sum+=c[i+m];
sum-=c[i];
num += sum;
ans.push(num%10);
}
while( !ans.top() ){
ans.pop();
}
while( !ans.empty() ){
cout << ans.top();
ans.pop();
}
cout << endl;
}
return 0;
}