Codeforces Round #265 (Div. 2)

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;
}

 

b:Inbox (100500)

题意:对一个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;
}

 

c:No to Palindromes!

题意:给你一个没有长度为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:没看。。

 

posted @ 2014-09-08 21:03  iwtwiioi  阅读(370)  评论(0编辑  收藏  举报