日常爆零掉分wa
根据前一个字符串构造后一个字符串,从哪不同就从哪换
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
#include
using namespace std;
int main()
{
IO;
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
string s(200,'a');
cout<<s<<endl;
while(n--)
{
int j;
cin>>j;
s[j]=s[j]=='a'?'b':'a';
cout<<s<<endl;
}
}
return 0;
}
大佬博客题解
这方法太妙了啊!!!我什么时候能想出这么秒的方法
动态规划
状态表示:f[i][j]
表示在第j
秒到达第i
片海域是否合法
状态计算:可以从第i-1
片海域花费1
秒过来,或者在第i
片海域原地等待1
秒,即f[i][j]=f[i-1][j-1]|f[i][j-1]
,当然还要检查是否满足水位限制
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
using namespace std;
const int N=110,M=20010;
int f[N][M];
int d[N],p[2*N];
void init(int k)
{
memset(f,0,sizeof f);
for(int i=1;i<=k;i++) p[i]=i;
for(int i=k+1;i<2*k;i++) p[i]=2*k-i;
for(int i=0;i<2*k;i++) f[0][i]=1;
}
int main()
{
IO;
int T;
cin>>T;
while(T--)
{
int n,k,l;
cin>>n>>k>>l;
init(k);
for(int i=1;i<=n;i++) cin>>d[i];
for(int i=1;i<=n;i++)
for(int j=1;j<2*k*n;j++)
{
f[i][j]=f[i-1][j-1]|f[i][j-1];
if(d[i]+p[j%(2*k)]>l )f[i][j]=0;
}
bool ok=0;
for(int i=0;i<2*k*n;i++)
if(f[n][i])
{
ok=1;
break;
}
if(ok) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
有一说一英语不好题目都没看懂-。-wtcl
对于A,B字符串如果存在A[i]>B[i]
则无解,否则有解
用一个set记录每一个字符需要变成那些字符,每次贪心的让其变成最小需要变成的字符,重复操作。set自动排序去重
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
#include
#include
using namespace std;
typedef long long ll;
set<int> mp[26];
int main()
{
IO;
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
string a,b;
cin>>a>>b;
bool ok=1;
for(int i=0;i<n;i++)
{
if(a[i]!=b[i])
{
if(a[i]>b[i])
{
ok=0;
break;
}
else mp[a[i]-'a'].insert(b[i]-'a');
}
}
if(!ok)
{
for(int i=0;i<26;i++) mp[i].clear();
cout<<-1<<endl;
continue;
}
int res=0;
for(int i=0;i<26;i++)
{
if(mp[i].empty()) continue;
int ans=*mp[i].begin();//全变成最小的字符
for(auto t:mp[i])
{
if(t==ans) continue;
mp[ans].insert(t);//那么新变成的字符也需要变成其他的
}
res++;
mp[i].clear();
}
cout<<res<<endl;
}
return 0;
}
虽然不会写,但是看到思路后自己能用set独立码出代码还是非常高兴的!!!渐渐熟悉STL(我是傻了吗-。-
异或操作有结合律,可以按位考虑,我们每次从最高位考虑。
设当前位是 1 1 1的数字个数为 x x x,是 0 0 0的数字个数为 y y y。
如果 x x x为偶数,则无论怎么选,最后两个得分在这个位都是一样的没必要考虑这一位。
如果 x x x为奇数,且 x m o d 4 = 1 x mod 4=1 xmod4=1,先手先选择一个1,然后后手选什么先手就选什么,先手最终该位一定是 1 1 1必胜;如果 x m o d 4 = 3 , x mod4 = 3, xmod4=3, 且 y y y是偶数,则后手完全可以跟随先手的操作,最后先手在该位一定是偶数个1,异或结果为0,先手必输。如果 x m o d 4 = 3 x mod4 = 3 xmod4=3但是 y y y是奇数,那么先手一定能赢,先手先拿该位为0的数,使整个局势转移到上一情形中。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=40;
int bit[N];
int main()
{
IO;
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
memset(bit,0,sizeof bit);
for(int i=0;i<n;i++)
{
ll a;
cin>>a;
for(int j=0;j<=32;j++) bit[j]+=(a>>j&1);
}
int flag=0;
for(int i=32;i>=0;i--)
if(bit[i]&1)
{
int x=bit[i],y=n-bit[i];
if(x%4==1)
{
flag=1;
}
else
{
if(y&1) flag=1;
else flag=-1;
}
break;
}
if(flag==1) cout<<"WIN"<<endl;
else if(flag==-1) cout<<"LOSE"<<endl;
else cout<<"DRAW"<<endl;
}
return 0;
}
争取div2不爆0~~要加油哦!