A.A Hero Named Magnus
因为核酸检测然后迟到,到了队友开始看题,因为没有榜(是训练),所以我们就去看运行时间少的,然后就看了A题,我有个好习惯 先看输出样例,看了一眼满足2*x-1,然后队友就开始写,因为对数据范围没处理好,然后爆int了,然后改成long long,就AC了(上次ICPOC昆明站也是看样例,猜出来结论,需要处理一下取整,不过我是志愿者,旁观者清吧)
题目链接
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int N=1e6+7;
int a[N],b[N],dp[505][505];
#define ll long long
int main()
{
ll t;
ll p,q;
cin>>t;
for(ll i=1;i<=t;i++)
{
cin>>p;
cout<<2*p-1<<endl;
}
return 0;
}
G.Occupy the Cities
题目大意:给定一个0,1串,然后通过某种操作将其全变为1,要按照下列规则;对于所有的1,一次操作都可以向左或右同化一个(将其变为1),则此次的同化为的1,也会参与下次变化,输出一共最少进行多少次操作
例;0100-》0110-》1111,输出2
思路:二分答案,关键是check函数,我们将遇到的第一个1,前面的0进行记录
1.若未同化0的数量大于mid(二分的数),则直接返回false,说明若这个1只考虑向左同化都不能将左边的全变为1,当然就不符合条件
2.当未同化0的个数的等于mid,则说明在不考虑右边的情况下,可以将未同化的0变为1,所以1的第一步一定向左同化,考虑到第一步向左同化后,一开始的1可以向右同化的数量为mid-1
3.当未同化的0的个数小于mid,则说明这个1可以先往右同化一个然后再同时向两边同化,所以可以向左和向右都可以同化mid
后面可以用负数代表这个1往右同化多少,细节见代码
#include<bits/stdc++.h>
#define ll long long
#define PI 3.141592653589793
#define E 2.718281828459045
#define