很简单吧,答案1478
int x=2020;
while(x>=9){
cout<
反着输出一遍就行了
这个我不确定啊 012 不知道算不算,我是算了,答案14,不算就是4
这个好做、
sum=5*a+2*b;
ans+=7*(sum/n);
sum=sum%n;
if(sum<=5*a){
ans+=sum%a==0?sum/a:sum/a+1;
}
else{
ans+=5;
ans+=sum>b?2:1;
}
其实就是ans[i]=max(max(i,2*n-2*i),2*i)。代码挺简单的没存。
他从左边剪过去一趟能长i
剪完自己到右边在剪回来能长2*n-2*i。
剪完自己到左边在剪回来能长2*i。
这道题看懂了就很简单,虽然我看了很久,但是挺简单
数 3 2 1
进制 8 10 2
转化为10进制:1+2*2+3*10*2=65
数 10 4 0
进制 11 5 2
数 1 2 0
进制 11 5 2
转化为10进制:0+4*2+10*5*2=108
转化为10进制:0+2*2+1*5*2= 1 4
我们一个十进制数 123 = 3+2*10(个位进制)+1*10(十位进制)*10(个位进制)
代码如下:
#include
using namespace std;
typedef long long ll;
int a[100005];
int b[100005];
int c[100005];
int temp[100005];//记录每一位的进制
const ll mod=1000000007;
int main(void)
{
ios::sync_with_stdio(false);
int n,ma,mb;
cin>>n;
for(int i=1;i<=n;i++){
a[i]=0;
b[i]=0;
}
cin>>ma;
for(int i=ma;i>0;i--){//从后往前方便点
cin>>a[i];
}
cin>>mb;
for(int i=mb;i>0;i--){
cin>>b[i];
}
ll ans=0;
temp[0]=0;
for(int i=1;i<=max(ma,mb);i++){//找最合适的进制记录在temp
if(a[i]>=b[i]){
temp[i]=max(max(a[i],b[i])+1,2);
}
else{
temp[i]=n;
}
c[i]=a[i]-b[i];
}
ans=c[1];
ll ant=temp[1];//记录前面进制的积
for(int i=2;i<=max(ma,mb);i++){
ans=(ans+c[i]*ant)%mod;
ant=ant*temp[i]%mod;
}
cout<
我是用dfs做的,思路是:
我们先拿到一个矩形,然后深搜,他可以向右拓展一列,也可以向下拓展一行,然后判断是否满足,注意用一个map记录已经满足的条件,最后加一点剪枝。
大概就是
然后应该能过80%吧....,我感觉。
#include
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll n,m,k;
ll ans=0;
ll mp[505][505];
map,pair >,int>rec;
void dfs(ll sum,int tx,int ty,char flag,int indx,int indy,int index){
//sum 当前总和 tx,ty为初始左上那个点,flag 记录是行还是列,index记录加哪一行哪一列,
//indx - indy 为加上这个区间的行或列。
if(flag=='h'){
for(int i=indx;i<=indy;i++){
sum+=mp[index][i];
}
indx=index;//更新一下下一次要加哪一行哪一列
indy=indy;
}
else{
for(int i=indx;i<=indy;i++){
sum+=mp[i][index];
}
indx=indy;
indy=index;
}
//cout<>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
cin>>mp[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]<=k){
dfs(0,i,j,'h',j,j,i);
}
}
}
cout<
递推式子不知道对了没,我知道对了我在写思路吧,我错了也可以告诉我,我哭给你看。
#include
using namespace std;
typedef long long ll;
const ll N=10000000;
const ll mod= 1000000007;
ll ans[N+5];
int main(void)
{
ios::sync_with_stdio(false);
ll n;
cin>>n;
ans[1]=1;
ans[2]=2;
for(int i=3;i<=n;i++){
ans[i]=(ans[i-1]+ans[i-2]+2)%mod;
}
cout<
#include
using namespace std;
typedef long long ll;
ll f[50004];
ll x[50004],y[50004],r[50004];
ll Find(int x){
if(f[x]==x)return x;
return f[x]=Find(f[x]);
}
int main(void)
{
ios::sync_with_stdio(false);
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i]>>r[i];
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<=r[i]*r[i]){//并查集给在范围的弄一起
int tx=Find(i);
int ty=Find(j);
f[tx]=ty;
}
}
}
mapmp;
for(int i=1;i<=n;i++){
int x=Find(i);
mp[x]++;//直接记录头子是一样的炸弹有多少
}
ll xs,ys,rs;
sets;
for(int i=1;i<=m;i++){
cin>>xs>>ys>>rs;
for(int i=1;i<=n;i++){
if((xs-x[i])*(xs-x[i])+(ys-y[i])*(ys-y[i])<=rs*rs)
{
s.insert(f[i]);//记录一下那些头子会被炸,然后去找头子是被标记的炸弹。
}
}
}
set::iterator it;
ll ans=0;
for(it=s.begin();it!=s.end();it++){
ans+=mp[*it];
}
cout<
我不知道啊,为什么要取模啊,有这么大吗,我也是dfs对一次ans++,咋那么大呢?我不理解
注意结尾一定是花才行。剪下枝多混点分啥的。
#include
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll n,m;
ll ans=0;
void dfs(ll sum,int shop,int flo,int flag){//sum 酒量 shop遇见几个商店了 flo 见几朵花了,flag刚刚见了花,最后见的是花才符合
if(sum==0&&shop==n&&flo==m&&flag==1){
ans=(ans+1)%mod;
}
else if(sum>m-flo)return;
else if(sum<0||sum==0&&flo>n>>m;
dfs(2,0,0,1);
cout<
没多少时间了,直接模拟混分了....每次剪最长的,用优先队列记录,顺便看看周围有没有一样高的,有就一起嘎了。给我四分之一我就满足了。
#include
using namespace std;
typedef long long ll;
ll h[200005];
int main(void)
{
ios::sync_with_stdio(false);
int n;
cin>>n;
priority_queueq;
for(int i=1;i<=n;i++){
cin>>h[i];
q.push(h[i]);
}
ll ans=0;
while(q.top()!=1){
ll temp=q.top();
for(int i=1;i<=n;i++){
if(h[i]==temp){
for(int j=i;j<=n&&h[j]==temp;j++){
q.pop();
h[j]=(ll)floor(sqrt(h[j]/2+1));
q.push(h[j]);
}
ans++;
}
}
}
cout<