A:http://codeforces.com/contest/1155/problem/A
只要后面一项的二进制码小于前一项 就满足。而且如果有 一定满足一次
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
string s;
cin>>s;
int l=s.length();
for(int i=1;i<l;i++)
{
if(s[i]<s[i-1])
{
cout<<"YES"<<endl<<i<<" "<<i+1<<endl;
return 0;
}
}
cout<<"NO"<<endl;
return 0;
}
B:http://codeforces.com/contest/1155/problem/B
博弈 先手肯定优先取前面不是8的数
后手的人肯定优先取前面是8的数
判断一下到11位时第一位是不是8即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string s;
cin>>n>>s;
int w=(n-11)/2;
int num8=0,num=0;
for(int i=0;i<n;i++)
{
if(s[i]-'0'==8)
num8++;
else
num++;
if(num8==w+1)
break;
}
if(num8<=num||num8<=w)
puts("NO");
else
puts("YES");
return 0;
}
C:http://codeforces.com/contest/1155/problem/C
相当于求xi这个序列差分的gcd pn
然后与pi这个序列每个进行求gcd如果gcd(pn,pi)==pi说明 pi为差数的时候可以构造出全包括xi的序列的等差序列
注意!!! 首项要大于0
#include<bits/stdc++.h>
using namespace std;
const int M=300000+100;
typedef long long ll;
ll gcd(ll a,ll b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>m;
ll x,pre,pn=1,pos=-1,fx;
cin>>x;pre=x;fx=x;
cin>>x;pn=x-pre;
for(int i=3;i<=n;i++)
{
cin>>x;
pn=gcd(pn,x-pre);
pre=x;
}
for(int i=1;i<=m;i++)
{
cin>>x;
if(gcd(x,pn)==x)
{
pos=i,pre=x;
}
}
//cout<<pn<<endl;
ll w=fx-fx%x;
if(w==0)w+=fx%x;
if(pos>0)
cout<<"YES"<<endl<<w<<" "<<pos<<endl;
else
cout<<"NO"<<endl;
return 0;
}
D:http://codeforces.com/contest/1155/problem/D
n个数 可以先改变任意段将他们乘x 然后求最大字段和。
有2个状态 第i位取或不取,第i位变或不变
如果i位没变i-1变了 那后面就不能再变了。
我们可以令dp【i】【j】表示取到第i位时(取第i位)最大子段和
//j==0 i 未改 i-1改 【不能向后传递j==1,j==2】
//j==1 i未改,i-1未改 可向后传递
//j==2 i改 i-1都行 可向后
#include<bits/stdc++.h>
using namespace std;
const int M=300000+100;
typedef long long ll;
ll a[M];
ll dp[M][3];
//以第i位为末尾最大子段和 ;
//第j位改,第i-1位未改
//分成3种情况
//j==0 i 未改 i-1改 【不能向后传递1,2】
//j==1 i未改,i-1未改 可向后传递
//j==2 i改 i-1都行 可向后
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll n,x;
ll sum=0;
cin>>n>>x;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
dp[i][2]=max(max(dp[i-1][2]+a[i]*x,dp[i-1][1]+a[i]*x),a[i]*x);
dp[i][1]=max(dp[i-1][1]+a[i],a[i]);
dp[i][0]=max(dp[i-1][2]+a[i],dp[i-1][0]+a[i]);
sum=max(max(sum,dp[i][1]),max(dp[i][2],dp[i][0]));
}
cout<<sum<<endl;
return 0;
}/*
5 -1
-2 1 2 3 4 */