昨天真是自闭的一天 hdu 牛客 cf 全部挤在一天
打到cf的时候整个人都麻木了 感觉
完全没思路 然后自闭睡觉了
今天早上一起来发现就有思路了。。。。
依然还是掉大分哎
果然还是要休息好 脑子才灵光
直接找两个数组相同的一个元素就行
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 3e4+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
int vis[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
ms(vis,0);
scanf("%d%d",&n,&m);
int index=-1;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
vis[x]=1;
}
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
if(vis[x]==1)
index=x;
}
if(index==-1)
printf("NO\n");
else
{
printf("YES\n");
printf("1 %d\n",index);
}
}
}
这题昨天也卡了挺久的 思考到非1的数那里就思路就断了
一直在想特判 还是题目做少了 没什么感觉
这种题一般都有个通解 不会需要太多特判
如果数组只有1 那么根据1的个数直接判断胜负就好
如果有非1数 那么先到达非1数的赢 可以自己去想一想
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
int a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,flag=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]!=1&&flag==0)
flag=i;
}
if(flag==0)
{
if(n%2==1)
printf("First\n");
else
printf("Second\n");
}else
{
if(flag%2==1)
printf("First\n");
else
printf("Second\n");
}
}
}
这题昨晚上也是到中间思路断了 然后自闭睡觉了
挺可惜的
因为题目没有给步数限制 所以可以一位一位的修改
题目是用前缀修改 所以从后往前修改可以保证修改好的数不被影响到
所以我们从后往前记录 如果当前位 a[i]!=b[i]
那么我们将a串1到i翻转 在将1修改 在翻转1到i
这时候a[i]就等于b[i]了
我们重复上述操作 知道完成整个字符串 就是答案了
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 2e3+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
char a[maxn],b[maxn];
int ans[maxn<<1];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
scanf("%s%s",a+1,b+1);
int cnt=0;
for(int i=n;i>=1;i--)
{
if(a[i]!=b[i])
{
ans[++cnt]=i;
if(i!=1)
{
ans[++cnt]=1;
ans[++cnt]=i;
}
}
}
printf("%d ",cnt);
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
printf("\n");
}
}
这题看的别人的题解 才知道咋做的
因为题目限制了不大于2n行动步数 我们需要改方法
根据2n 我们很容易能想到对于整个串做两次从1到n的操作
那么我们可以先用n个操作将a串变成同一个字符
然后记录当前时刻串的样子
再去跟b串每个位置作比较 从后往前保证修改过的值不被影响
每次修改后记录当前位置往前的串的样子
重复这些操作 最后就能完成题目给的任务了
还有这题的n的范围变了 记得改 不然会re
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <utility>
#define pi 3.1415926535898
#define ll long long
#define lson rt<<1
#define rson rt<<1|1
#define eps 1e-6
#define ms(a,b) memset(a,b,sizeof(a))
#define legal(a,b) a&b
#define print1 printf("111\n")
using namespace std;
const int maxn = 1e5+10;
const int inf = 0x3f3f3f3f;
const ll llinf =0x3f3f3f3f3f3f3f3f;
const int mod = 1e9+7;
char a[maxn],b[maxn];
int ans[maxn<<1];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,cnt=0;
scanf("%d",&n);
scanf("%s%s",a+1,b+1);
for(int i=1;i<n;i++)
{
if(a[i]!=a[i+1])
ans[++cnt]=i;
}
char now=a[n];
for(int i=n;i>=1;i--)
{
if(b[i]!=now)
{
ans[++cnt]=i;
now=b[i];
}
}
printf("%d ",cnt);
for(int i=1;i<=cnt;i++)
printf("%d ",ans[i]);
printf("\n");
}
}