Codeforces Global Round 1 A--E

A. Parity

/**
题意:进制转换,判结果奇偶
*/
#include
#define ll long long
using namespace std;

int main (){
    int b,k,ans=0;cin>>b>>k;
    for(int i=0;i>x;
        ans=(ans*b+x)%2;
    }
    puts((ans&1)?"odd":"even");
    return 0;
}
//python
b , k = map(int,input().split())
a = list(map(int,input().split()))
ans = 0
for x in a:
    ans = (ans*b+x)%2
if ans&1 == True:
    print("odd")
else :
    print("even")

B. Tape

/**
贪心,考虑差分序列,计算每段的长度,去掉k-1段即可
*/
#include
#define ll long long
using namespace std;
const int maxn=1e6+7;
ll a[maxn],b[maxn];
int main(){
    ll n,m,k;
    scanf("%lld %lld %lld",&n,&m,&k);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=2;i<=n;i++) b[i-1]=a[i]-a[i-1]-1;
    sort(b+1,b+n);
    ll ans=0;
    for(int i=1;i<=n-k;i++) ans+=b[i];
    printf("%lld\n",ans+n);
    return 0;
}

C. Meaningless Operations

/**
打表观察可得,n为2^x - 1 ans:n的最大的因子,否则 则是二进制位与n等长的数-1
*/
#include
#define ll long long
using namespace std;
int main(){
	int t;cin>>t;
	while(t--){
		cin>>n;
		int fac=1,flag=0,tmp=n;
		while(n){
			if(n%2==0) flag=1;
			n/=2,fac*=2;
		}
		if(flag) printf("%d\n",fac-1);
		 else{
		 	int mx=1;n=tmp;
		 	for(int i=2;i*i<=n;i++) if(n%i==0) mx=max(mx,max(n/i,i));
		 	printf("%d\n",mx);
		 }
	}
	return 0;
}

 D. Jongmah

/**
题意:一段序列存在多少个连续或者相同数字的三元组
思路:考虑动态规划,dp[i][j][k]:表示1-->i有j个递增的三元组和有k个相等的三元组;
枚举j为递增三元组,将剩余的a+1--->a+1,a+1,a+1状态转移:dp[i][j][k]=max(dp[i][j][k],dp[i-1][k+x][x]+x+(a[i]-j-x)/3);
*/
#include
#define ll long long
using namespace std;

int k,x,b[300001],a[2000001],dp[3000001][5][3];

int main(){
	int n,m;scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		a[x]++;
	}
	memset(dp,2000,sizeof(dp));
	for(int i=0;i<=2;i++) dp[1][i][0]=(a[1]-i)/3;
	for(int i=2;i<=m;i++)
	 for(int j=0;j<=4;j++) if(a[i]>=j)
	  for(int k=0;k<=2;k++) if(a[i-1]>=k)
	   for(int x=0;x<=2;x++)
        if(a[i]-j>=x&&a[i-1]-k>=x) dp[i][j][k]=max(dp[i][j][k],dp[i-1][k+x][x]+x+(a[i]-j-x)/3);
	//
	cout<

E. Magic Stones

/**
E. Magic Stones
https://codeforces.com/contest/1110/problem/E
考虑差分序列;
设序列[a1,a2,a3],得到新的数组为[a1,a1+a3-a2,a3],新数组的差分序列为[a3-a2,a2-a1]
所以最后判断序列是否能够进行转换是直接判断差分序列是否相等即可;
*******tricks****
首和尾记得特判一下QWQ
*/
#include
#define ll long long
using namespace std;

ll k,n,m,b[200001],a[200001];

mapmp;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]-a[i-1]]++;;//a[0]=0,a[n]=0;
	for(int i=1;i<=n;i++) cin>>b[i];//b[0]=0,b[n]=0;
	if(a[1]!=b[1]||a[n]!=b[n]) {puts("No");return 0;}
	for(int i=1;i<=n;i++){
        if(mp[b[i]-b[i-1]]==0) { puts("No");return 0;}
        else mp[b[i]-b[i-1]]--;
	}
	if(a[n]!=b[n]) puts("No");
	else puts("Yes");
	return 0;

	/**
	7 2 4 12
	7 15 10 12

	-5 2 8
	8 -5 2
	
	2 3 2
	2 1 2
	2 1 -1
	2 -1 1
	
	*/
}

 

你可能感兴趣的:(CodeForces)