http://codeforces.com/contest/465
rating+7,,简直。。。
感人肺腑。。。。。。。。。。。。。。。蒟蒻就是蒟蒻。。。。。。。。。
被虐瞎
a:inc ARG
题意:将串反过来后+1问有多少个位变化。。
。。我是模拟的。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=105;
int a[N], n;
int main() {
read(n);
char s[N];
scanf("%s", s);
rep(i, n) a[i+1]=s[i]-'0';
a[1]+=1;
int t=a[1]/2, i=2, ans=1; a[1]%=2;
while(t && i<=n) {
a[i]+=t;
t=a[i]/2;
a[i]%=2;
i++;
++ans;
}
print(ans);
return 0;
}
题意:对一个01序列有3种操作,要求将所有的1变成0,求最小步数
1.从目录到达任意位置。(到达的地方1变成0,如果是0那么不变)
2.回到目录
3.向前或想后走一步
显然的贪心。。。
对于一个相连的块,要到达下一个块,最佳方案就是回到目录再到下一个块的初始位置,需要2步(尽管他们距离1,向前走也是需要2步)
对于同一个块内的点,直接往前走就行。。
然后模拟累计。。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=1005;
int a[N], n;
int main() {
read(n);
for1(i, 1, n) read(a[i]);
int ans=-1;
for1(i, 1, n) {
while(a[i]==0 && i<=n) ++i;
if(i>n) break;
while(a[i]&&a[i+1] && i<=n) { ++i; ++ans; }
ans+=2;
}
if(ans==-1) ans=0;
print(ans);
return 0;
}
题意:给你一个没有长度为2以上(包括2)的回文串的一个字符串,然后让你求比他大的所有排列且没有长度为2以上(包括2)的下一个最小的排列。
剩下的1个半小时都在搞这题。。。。。。。。。。T_T
神题。。
我dfs写渣
判重写渣
然后滚粗。
这里有个贪心。
串的任意部分都不能是回文=串中任意连续3个字符互不相同
那么如果从左往右找,那么只需要判断x-1和x-2与x不等即可
其次我们要保证字典序最小,所以我们从右向左依次尝试修改,只要找到不符合回文条件的点,就修改它。这样保证了前边的最小。。
而且能证明,后边一定能构造出一个不是回文的串。例如m=4,我可以构造abcabcabc。。。。。。。。。。。。(x-1和x-2与x不等)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=2015;
char str[N];
int n, m; inline const char fix(const int &p) {
char i;
for(i=str[p]+1; i<'a'+m; ++i)
if(str[p-1]!=i && str[p-2]!=i) return i;
return 0;
}
int main() {
read(n); read(m);
scanf("%s", str);
int len=strlen(str);
int i;
for(i=len-1; i>=0; --i) {
char t=fix(i);
if(t) { str[i]=t; break; }
}
if(i==-1) { puts("NO"); return 0; }
for(++i; i<len; ++i) {
str[i]='a'-1;
char t=fix(i);
if(t) str[i]=t;
}
printf("%s", str);
return 0;
}
d:没看。。
e:没看。。