日常爆零掉分wa
A. Common Prefixes
根据前一个字符串构造后一个字符串,从哪不同就从哪换
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<<x<<" "
#include<iostream>
#include<algorithm>
#include<string>
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;
}
大佬博客题解
这方法太妙了啊!!!我什么时候能想出这么秒的方法
B1. Koa and the Beach (Easy Version)
动态规划
状态表示: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<<": "<<x<<" "
#include<iostream>
#include<algorithm>
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
C. String Transformation 1
对于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<<": "<<x<<" "
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
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(我是傻了吗-。-
D. GameGame
异或操作有结合律,可以按位考虑,我们每次从最高位考虑。
设当前位是111的数字个数为xxx,是000的数字个数为yyy。
如果xxx为偶数,则无论怎么选,最后两个得分在这个位都是一样的没必要考虑这一位。
如果xxx为奇数,且xmod4=1x mod 4=1xmod4=1,先手先选择一个1,然后后手选什么先手就选什么,先手最终该位一定是111必胜;如果xmod4=3,x mod4 = 3,xmod4=3, 且yyy是偶数,则后手完全可以跟随先手的操作,最后先手在该位一定是偶数个1,异或结果为0,先手必输。如果xmod4=3x mod4 = 3xmod4=3但是yyy是奇数,那么先手一定能赢,先手先拿该位为0的数,使整个局势转移到上一情形中。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define debug(x) cout<<#x<<": "<<x<<" "
#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
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~~要加油哦!