比赛网址:http://codeforces.com/contest/1285
A
题面:
输入一个长度为n的字符串(仅有L和R组成),代表机器人在x坐标轴上的移动指令,该机器人可能忘掉了部分指令,问你机器人最后能落在多少不同的位置?
solution:
记录L和R的个数,答案即为L+R+1(其实也可以直接输出n+1)
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int n,cnt1 = 0,cnt2 = 0;
cin>>n;
string s;
cin>>s;
for(int i=0;i<n;i++)
{
if(s[i] == 'L')
cnt1++;
else
cnt2++;
}
cout<<cnt1+cnt2+1<<endl;
return 0;
}B
题面:
给出一个长度为n的数组,代表n块面包的美味值,A要买完所有的面包,B可以买任意连续子序列的面包,但是不能全部都买,问你是否能使B的美味值大于等于A?
solution:
很明显,我们要找到[1,n-1]和[2,n]的最大连续子序列和然后和[1,n]的和比较即可
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,flag = 0;
ll sum = 0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum += a[i];
}
ll sum1 = 0,sum2 = 0,maxx = -1e9;
for(int i=1;i<n;i++){
sum1 += a[i];
if(a[i] > sum1)
sum1 = a[i];
maxx = max(maxx , sum1);
}
for(int i=2;i<=n;i++){
sum2 += a[i];
if(a[i] > sum2)
sum2 = a[i];
maxx = max(maxx , sum2);
}
if(maxx >= sum)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}C
题面:
输入n,输出a b,满足a和b的最小公倍数 = n,而且最小化max(a,b)
solution:
从sqrt(n)遍历,找到__gcd(a,b) == 1 的即为答案,如果gcd不等于1,那么最小公倍数肯定也不等于n
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
ll n;
int flag = 0;
cin>>n;
ll sq =sqrt(n);
for(ll i=sq; ;i--)
{
if(n%i == 0){
ll x = i;
ll y = n/i;
if(__gcd(x,y) == 1){
flag = 1;
cout<<x<<" "<<y<<endl;
break ;
}
}
if(flag)
break ;
}
return 0;
}D
题面:
给出一个大小为n的数组a1~an,请找到最佳的x,满足max(ai^x)最小(1<=i<=n),输出最小的max(ai^x)
solution:
这题没做出来,知道是二进制贪心,但是写不出来,不知道怎么处理01同时存在同一位上的情况,看了题解明白了,如果某一个位置上全部都是0或者全部都是1,那这一位肯定都是0,如果0和1同时存在,我们取min(这一位是0,这一位是1) + (1<<i)
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005;
int a[maxn];
int dfs(int i,vector<int> &v){
vector<int> v0,v1;
if(i < 0)
return 0;
for(int j=0;j<v.size();j++){
if((v[j]>>i)&1)
v1.push_back(v[j]);
else
v0.push_back(v[j]);
}
if(v0.size() == 0)
return dfs(i - 1,v1);
if(v1.size() == 0)
return dfs(i - 1,v0);
return min(dfs(i-1 , v0) , dfs(i-1 ,v1))+(1<<i);
}
vector<int> v;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
v.push_back(a[i]);
}
cout<<dfs(30 , v);
return 0;
}
京公网安备 11010502036488号