http://codeforces.com/contest/888

Local Extrema【水】

【题意】:计算极值点个数

【分析】:除了第一个最后一个外,遇到极值点ans++,包括极大和极小

【代码】:

#include<bits/stdc++.h>

using namespace std;

int main()
{
int n,a[+];
int maxn,minn;
maxn=minn=;
cin>>n;
for(int i=;i<=n;i++)
{
cin>>a[i];
}
for(int i=;i<=n-;i++)
{
if(a[i]>a[i+]&&a[i]>a[i-]) maxn++;
if(a[i]<a[i+]&&a[i]<a[i-]) minn++;
}
cout<<minn+maxn<<endl;
return ;
}

暴力

Buggy Robot【模拟】

【题意】:机器人从(0,0)出发,有UDLR四种走法,分别代表上下左右的方向,最后回到(0,0),给你一段包含这些走法的序列,求最多有几个走法正确(即可以删去最少的操作使其能够回到原点)。

【分析】:记录下四个方向执行了几次,然后取相反方向的最小值乘2。我是这么想的,还特判了。最后被hack了···

【代码】:

#include<bits/stdc++.h>

using namespace std;

int main()
{
int n,min1,min2;
int l,d,u,r;
l=d=u=r=min1=min2=;
char a[];
cin>>n;
for(int i=;i<n;i++)
{
cin>>a[i];
if(a[i]=='L') l++;
else if(a[i]=='D') d++;
else if(a[i]=='U') u++;
else r++;
}
if(l&&(!r)){
printf("0\n");
return ;
}
if(r&&(!l)){
printf("0\n");
return ;
}
if(u&&(!d)){
printf("0\n");
return ;
}
if(d&&(!u)){
printf("0\n");
return ;
} if(l&&r) min1=*min(l,r);
if(u&&d) min2=*min(u,d); printf("%d\n",min1+min2);
return ;
}

被hack代码

#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N,l=,r=,u=,d=;
cin>>N;
string s;
cin>>s;
for(int i=;i<s.length();i++){
if(s[i]=='L')l++;
if(s[i]=='R')r++;
if(s[i]=='U')u++;
if(s[i]=='D')d++;
}
cout<<*(min(l,r)+min(u,d))<<endl;
}

AC

K-Dominant Character【贪心】

【题意】:给一小写字母组成的字符串,找个长度最短的k。使得这些长度为k的子串必须包含了某同一个字符。

【分析】:记录下两个相同字符的最长距离,然后取这些距离的最小值。最小化最大值。

一个数组记录该字母上一次出现的位置

一个数组记录该字母相邻最大距离

如果没有重复出现的字符呢

设定在-1和len两个位置上和所以字母相同

 比如abbbabba串,对于字母a,有距离4,3,那么数组里存的就是4 

(金牌讲师010):对于aab
有a这个位置的是
1 2
字符串长度是3
间距分别是
0-1 1
1-2 1
2-4 2
0和4是字符串的边界外
所以对于字符a就是2是最大间距
b只有3这个位置出现
0-3 3
3-4 1
所以b的最大间距是3
这题答案就是2
字符串的边界外也算进去?
因为
___x___x____x__
两边还有__
x是出现的位置

【代码】:

#include<bits/stdc++.h>

using namespace std;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
const double pi = acos(-1.0);
const int maxn = +;
const int mod = 1e9+;
char a[maxn];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
scanf("%s",a+);
int len=strlen(a+),ans=len;
for (int i=;i<;i++){
int tmp=;
int pos=;
for (int j=;j<=len;j++)if (a[j]==i)tmp=max(tmp,j-pos),pos=j;
tmp=max(tmp,len+-pos);
ans=min(ans,tmp);
}
printf("%d\n",ans);
return ;
}
D. Almost Identity Permutations【排列组合】
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

A permutation p of size n is an array such that every integer from 1 to n occurs exactly once in this array.

Let's call a permutation an almost identity permutation iff there exist at least n - k indices i (1 ≤ i ≤ n) such that pi = i.

Your task is to count the number of almost identity permutations for given numbers n and k.

Input

The first line contains two integers n and k (4 ≤ n ≤ 1000, 1 ≤ k ≤ 4).

Output

Print the number of almost identity permutations for given n and k.

Examples
input
4 1
output
1
input
4 2
output
7
input
5 3
output
31
input
5 4
output
76

【题意】:一个长为n的排列,其中pi=i的位置大于等于n-k的排列方案数, 比如n=5 k=3让你求有多少个1 2 3 4 5的排列使得至少5-3=2个数字在“原位”
【分析】:公式是C(n,i)*D(i) (0<=i<=k),
错排只用弄到4,
组合数也只用弄到1000,4 
 
【代码】:
By RoniKing, contest: Educational Codeforces Round , problem: (D) Almost Identity Permutations, Accepted, #
#include <bits/stdc++.h>
#define LL long long
using namespace std;
//const int mod=1e9+7;
const int maxn=1e3+;
LL D[maxn], C[maxn][];
int p[+];
void init()
{
D[]=;
D[]=;
for(int i=;i<maxn;i++)//错排
D[i]=((i-)*(D[i-]+D[i-]));
int i;
//for (p[0]=i=1;i<=200000;i++) p[i]=1ll*p[i-1]*i%mod;
for (int i = ; i < maxn; i++)//排列组合
{
for (int j = ; j <= min(, i); j++)
{
if (j == ) C[i][j] = ;
else
C[i][j] = (C[i-][j] + C[i-][j-]) ;
}
}
}
int main()
{
init();
int t; int n,k;
cin>>n>>k;
LL ans=;
for(LL i=;i<=n;i++)
ans = ans * i ;
LL val=;
for(int i=;i<=k;i++)
val=(val + D[i]*C[n][i]) ;
// cout<<ans<<endl;
cout<<val<<endl;
//cout<<(ans-val)<<endl; }

我的丑代码

#include<bits/stdc++.h>

using namespace std;

int main()
{
long long n,k;
cin>>n>>k;
long long ans=;
if(k>=) ans+=n*(n-)/;
if(k>=) ans+=n*(n-)*(n-)/;
if(k>=) ans+=n*(n-)*(n-)*(n-)*/;
cout<<ans;
return ;
}

简♂短

04-16 13:58