Educational Codeforces Round 153 (Rated for Div. 2)
思路:构造题
我们发现,最终合法的式子中一定含有"()“,那么当s为”()“时一定输出 ,然后分类讨论,当s中存在”)(“,那么我们就用括号套括号,就是”(())“来表示,显然这中间不会有”)(“子序列存在,如果不存在”)(“,那我们就用并列括号来表示,即”()()"。
代码
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=3e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,a1,a2;
vectordel;
int a[N],b[N];
int prime[N];
bool st[N];
mapmp;
int lowbit(int x) {
return (-x)&x;
}
void solve(){
string s;std::cin>>s;
if(s=="()"){
std::cout<<"NO\n";
return ;
}
else{
cout<<"YES\n";
int f=0;
rep(i,1,s.size()-1){
if(s[i]==s[i-1]){
f=1;
break;
}
}
if(f){
string c="()";
rep(i,0,s.size()-1)std::cout<>t;
while(t--)solve();
}
//-2 -2 -2 -2 0 0 0 0 0 3
思路:
首先我们预处理出最多需要多少个ak为x,在ak为x个的情况下a1有y个,然后当a2>=x,在判断a1和y的大小即可,当a2
代码
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=3e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,a1,a2;
vectordel;
int a[N],b[N];
int prime[N];
bool st[N];
mapmp;
int lowbit(int x) {
return (-x)&x;
}
void solve(){
std::cin>>m>>k>>a1>>a2;
int res=0;
int x=m/k;
int y=m%k;
if(a2>=x){
if(a1>=y){
std::cout<<0<<"\n";
}else{
std::cout<=y){
a1-=y;
x-=(a1/k);
std::cout<>t;
while(t--)solve();
}
//-2 -2 -2 -2 0 0 0 0 0 3
思路:
我们可以从左到右来考虑,假如Alice在点 i 下了棋,那么考虑 i 前面是否存在可选择的必胜状态,如果存在必胜状态或者前面没有能选择的状态,那么 i 就是必败状态,反之为必胜,计算必胜状态的数量即可。我们用 min 表示 i 前面的最小值, minlose 表示必胜状态的最小值,如果我们的 a[i] 大于 min ,说明前面有可选的状态,如果大于 minlose ,说明前面有可选的必胜状态。
#include
using i64 = long long;
void solve() {
int n;
std::cin >> n;
std::vector p(n);
for (int i = 0; i < n; i++) {
std::cin >> p[i];
p[i]--;
}
int minlose = n;
int min = n;
int ans = 0;
for (int i = 0; i < n; i++) {
int win = 0;
if (p[i] < min) {
min = p[i];
win = 1;
} else {
win = (minlose < p[i]);
}
if (!win) {
ans += 1;
minlose = std::min(minlose, p[i]);
}
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
方法二 lowbit(x)实现
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t;
vectordel;
int a[200010],b[200010];
int prime[N];
bool st[N];
mapmp;
int lowbit(int x){
return x&(-x);
}
void solve(){
std::cin>>n;
int l=1;
a[l++]=n;
if(n&1){
a[l++]=n-1;
n--;
}
while(n>1){
if(lowbit(n)==n){
a[l++]=lowbit(n)/2;
n-=(lowbit(n)/2);
}
else {
a[l++]=n-lowbit(n);
n-=lowbit(n);
}
}
std::cout<>t;
while(t--)solve();
}
#include
using namespace std;
typedef long long LL;
typedef pair pii;
const int N = 110, M = N * (N - 1) / 2;
int dp[N][M];
void solve()
{
string op;
cin >> op;
int n = op.size();
int c1 = count(op.begin(), op.end(), '1'), c0 = n - c1;
int need = (n * (n - 1) / 2 - c0 * (c0 - 1) / 2 + c1 * (c1 - 1) / 2) / 2;
memset(dp,0x3f,sizeof dp);
dp[0][0] = 0;
for (int i = 0; i < n; i++) {
for (int j = c1; j >= 1; j--) {
for (int k = i; k <= need; k++) {
dp[j][k] = min(dp[j][k], dp[j - 1][k - i] + (op[i] == '0'));
}
}
}
cout << dp[c1][need] << endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t = 1;
while (t--)
solve();
}