B-百变吗喽_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)
思路:首先遍历一遍s和t,找出两字符串的不同之处,如果不同的地方大于一个输出0,不同的地方只有一个时从不同处往回找,如果前一个与t【i】相同,说明t【i-1】也可以看作不同的字符,解决方案加一。不断向前找,直到出现不同的字符结束查找。将找到的位置记录,输出总的大小然后从小到大输出。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
//int x[9]={0,1,0,1,-1,0,-1,1,-1};
//int y[9]={0,0,1,1,0,-1,-1,-1,1};
struct position{
int po;
char ch;
};
bool cmp(position a,position b){
return a.po<b.po;
}
void solve(){
string s;
cin>>s;
int lens=s.size();
string t;
cin>>t;
int lent=t.size();
int pos=-1;
int flag=1;
for(int i=0;i<lent;i++){
if(pos==-1){
if(s[i]!=t[i]){
pos=i;
}
}else{
if(s[i-1]!=t[i]){
flag=0;
break;
}
}
}
vector<position> results;
if(flag==1){
for(int i=pos;i>=0;i--){
if(t[i]==t[pos]){
position pn;
pn.ch=t[i];
pn.po=i;
results.emplace_back(pn);
}else{
break;
}
}
}else{
cout<<"0"<<endl;
return;
}
int xx= results.size() ;
cout << results.size() << endl;
sort(results.begin(),results.end(),cmp);
for (const auto& result : results) {
cout << result.po << " " << result.ch << endl;
}
}
signed main() {
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
做题时一直超时因为想着用strsub,但忘记strsub的时间复杂度为on,叠加在一个for循环里导致时间复杂度变为on的平方,超时了。
II-正义从不打背身_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)
思路:这一题有点像模拟题,要找出反转的规律,首先可以先把前m个数据进行180度旋转的判断,然后再对位置进行调整,经过举例发现规律,前m个中,第一个一定是position【m】,然后减二的去输出,然后判断从一还是二开始下一轮的循环,我们将前m个循环结束后,再看m+1到n的状态。
代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
//int x[9]={0,1,0,1,-1,0,-1,1,-1};
//int y[9]={0,0,1,1,0,-1,-1,-1,1};
void solve(){
int n,m;
cin>>n>>m;
char ch;
int position[2000005];
for(int i=1;i<=n;i++){
cin>>ch;
if(ch=='P'){
position[i]=1;
}else{
position[i]=-1;
}
}
for(int i=1;i<=n;i++){
if((m-i+1)%2==1){
position[i]*=-1;
}
}
for(int i=m;i>0;i-=2){
if(position[i]==-1)cout<<"0 ";
else{
cout<<"1 ";
}
}
int start=0;
if(m%2==0){
start=1;
}else{
start=2;
}
for(int i=start;i<=m;i+=2){
if(position[i]==-1)cout<<"0 ";
else{
cout<<"1 ";
}
}
for(int i=m+1;i<=n;i++){
if(position[i]==-1)cout<<"0 ";
else{
cout<<"1 ";
}
}
}
signed main() {
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
C-16进制世界_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)
思路:这是一道很经典的背包问题,只是加上了一些约束,但用动态规划思想可以做出。设立dp[i][j]表示 饱食度为i时余数为j的食用数量,我们最终取dp[m][0]为最终答案。
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int v[N], w[N];
int dp[N][20];
void slove()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> v[i] >> w[i];
w[i] = w[i] % 16;
}
int maxx = 0;
for (int i = 1; i <= n; i++)
{
for (int j=m;j>=v[i];j--)
{
for (int k = 15; k >= 0; k--)
{
if (k != 0 && !dp[j - v[i]][k])
continue;
dp[j][(k + w[i]) % 16] = max(dp[j][(k + w[i]) % 16], dp[j - v[i]][k] + 1);
}
}
}
cout << dp[m][0] << "\n";
}
signed main()
{
int t=1;
//cin >> t;
while (t--)
{
slove();
}
}
L-koala的程序_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)
思路:原本的代码想要解决的是约瑟夫环问题,接着就有点套模板然后加上题目的一点点条件.
代码:
#include<iostream>
#include<deque>
using namespace std;
deque<int> res;
int n, k;
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
res.push_back(i);
}
int cnt = 0,pos=0;
while (res.size()>1)
{
pos=(pos+k-1)%res.size();
cout << res[pos] << " ";
res.erase(res.begin()+pos);
}
return 0;
}