A. 严格按照题目给的两个条件来。

#include<bits/stdc++.h>
using namespace std; int n,a[],b[]; int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = ;i <= n;i++) cin >> a[i] >> b[i];
int flag1 = ,flag2 = ;
for(int i = ;i <= n;i++)
{
if(a[i] != b[i]) flag1 = ;
}
for(int i = ;i < n;i++)
{
if(a[i] < a[i+]) flag2 = ;
}
if(flag1) cout << "rated" <<endl;
else if(flag2) cout << "unrated" << endl;
else cout << "maybe" << endl;
return ;
}

B.可能的值为xx = x+50k(xx >= y),从小到大枚举每一个可能的值,计算cnt就可以了。

#include<bits/stdc++.h>
using namespace std; int x,y,p,a[]; int main()
{
ios::sync_with_stdio(false);
cin >> p >> x >> y;
int xx = x;
while(x >= y)
{
int t = x/%;
for(int i = ;i <= ;i++)
{
t = (t*+)%;
a[i] = t+;
if(a[i] == p)
{
cout << << endl;
return ;
}
}
x -= ;
}
x = xx;
int cnt = ,now = ;
while()
{
int t = x/%;
for(int i = ;i <= ;i++)
{
t = (t*+)%;
a[i] = t+;
if(a[i] == p)
{
cout << cnt << endl;
return ;
}
}
x += ;
now++;
if(now == )
{
now = ;
cnt++;
}
}
return ;
}

C.先判断0和-1的情况,然后按大小分类。

若x/y < p/q,我们要把x/y变得尽量大,并且最后的值是p/q,可以变成(np-(y-x))/nq,计算n向上取整,然后结果为nq-y。

若x/y > p/q,我们要把x/y变得尽量小,即只加分母,不加分子,最后变成x/nq == np/nq,计算n向上取整,结果同上。

#include<bits/stdc++.h>
using namespace std; long long x,y,xx,yy; int main()
{
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--)
{
cin >> x >> y >> xx >> yy;
if(x*yy == y*xx)
{
cout << << endl;
continue;
}
if(x != && xx == || xx >= yy)
{
cout << - << endl;
continue;
}
if(x*yy < xx*y)
{
long long t = y-x;
long long ans = t/(yy-xx);
if(ans*yy-t < ans*xx) ans++;
cout << ans*yy-y << endl;
}
else
{
long long ans = x/xx;
if(ans*xx < x) ans++;
cout << ans*yy-y << endl;
}
}
return ;
}

还可以二分n值来写。


D.暴力枚举到100000就可以了。

#include<bits/stdc++.h>
using namespace std; int n,a[][],b[] = {},c[]; int calc(int x,int y,int z)
{
int t = -x;
if(x == -) return ;
if(*y > z) return *t;
if(*y > z) return *t;
if(*y > z) return *t;
if(*y > z) return *t;
if(*y > z) return *t;
return *t;
} bool ok(int x)
{
int sum1 = ,sum2 = ;
for(int i = ;i <= ;i++) c[i] = b[i];
for(int i = ;i <= ;i++)
{
if(a[][i] != - && a[][i] > a[][i]) c[i] += x;
}
for(int i = ;i <= ;i++)
{
sum1 += calc(a[][i],c[i],n+x);
sum2 += calc(a[][i],c[i],n+x);
}
return sum1 > sum2;
}
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = ;i <= n;i++)
{
for(int j = ;j <= ;j++)
{
cin >> a[i][j];
if(a[i][j] >= ) b[j]++;
}
}
for(int i = ;i <= ;i++)
{
if(ok(i))
{
cout << i << endl;
return ;
}
}
cout << - << endl;
return ;
}

E.分别对2的倍数,与2倍数间隔间的数计数,结果个数最多为1的个数,对每个个数,我们判断其是否可行。

我们贪心当前2的倍数之后一个的2的倍数,使剩下来的2的倍数的数量和非2倍数数量和尽可能少,因为剩下的个数为最小的划分的数的个数。

#include<bits/stdc++.h>
using namespace std; int n,now = ,num[] = {},two[] = {},ans[]; bool ok(int x)
{
int t = two[]-x;
for(int i = ;i <= now;i++)
{
if(x >= two[i])
{
t -= min(x-two[i],t);
x = two[i];
}
else t += two[i]-x;
t += num[i];
}
if(t <= x) return ;
return ;
} int main()
{
ios::sync_with_stdio(false);
cin >> n;
long long t = ;
for(int i = ;i <= n;i++)
{
long long x;
cin >> x;
if(x == t) two[now]++;
else if(x < t) num[now-]++;
else
{
while(t < x)
{
t *= ;
now++;
}
if(x == t) two[now]++;
else num[now-]++;
}
}
int cnt = ;
for(int i = ;i <= two[];i++)
{
if(ok(i)) ans[++cnt] = i;
}
if(cnt == ) cout << - << endl;
else
{
for(int i = ;i <= cnt;i++) cout << ans[i] << " ";
cout << endl;
}
return ;
}

F.首先一种特殊情况,我们选择权值最小(w0)的一条边,设其两点为A,B,不难理解,A,B两点的总p值均为(n-1)*w0。

然后,对于其他的点,取点a,每个点连接着(n-1)条边,对于每条边,权值为w1,设它连的点为a,b,那么,我们可以把除a,b外的所有点先连成最小,即所有边最终跑向A或B,即(n-3)*w0,然后连接A到b或者B到b,再b到a,这里最后两条路径的权值分为两种情况:①若前一点->b 大于 b->a,则总p值为(n-3)*w0+2*w1

②若前一点->b 小于 b->a,则总p值为(n-3)*w0+w前一点->b+w1

这样的情况下,我们在(n-1)*2种情况里取的最小p值为最优解。

第一种情况比较好求解,第二种情况我们可以从到b点的最优转换而来,把原来的a去掉,在最后加上b->a,即-minn+w1

这样我们就对求解顺序有一定的要求,按边权值从小到大排序,每次更新边的两个点,是符合要求的。

#include<bits/stdc++.h>
using namespace std; int n;
long long ans[];
struct xx
{
int u,v,w;
xx(int a,int b,int c):u(a),v(b),w(c){};
friend bool operator <(xx a,xx b)
{
return a.w < b.w;
}
}; vector<xx> v; int main()
{
ios::sync_with_stdio(false);
cin >> n;
for(int i = ;i <= n;i++) ans[i] = 1e18;
for(int i = ;i <= n;i++)
{
for(int j = i+;j <= n;j++)
{
int x;
cin >> x;
v.push_back(xx(i,j,x));
}
}
sort(v.begin(),v.end());
long long minn = v[].w;
for(int i = ;i < v.size();i++)
{
int x = v[i].u,y = v[i].v,w = v[i].w;
long long t = (long long)w*+minn*(n-);
ans[x] = min(ans[x],min(ans[y]-minn+w,t));
ans[y] = min(ans[y],min(ans[x]-minn+w,t));
}
for(int i = ;i <= n;i++) cout << ans[i] << endl;
return ;
}

Codeforces_807的更多相关文章

随机推荐

  1. C Primer Plus(二)

    重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 分支和跳转 1.ctype.h头文件里包含了一些列用于字符判断的函数,包括判断数字.大 ...

  2. MinGW-W64下载与安装

    安装方案 1 下载安装包,MinGW-w64 - for 32 and 64 bit Windows,然后直接以管理员安装即可,但是这个方案在部分电脑可能不行,会提示 cannot download ...

  3. Don’t Repeat Yourself,Repeat Yourself

    Don't Repeat Yourself,Repeat Yourself Don't repeat yourself (DRY, or sometimes do not repeat yoursel ...

  4. 实现github的自动钩子

    实现github的自动钩子 最近在学习go,也写了一些玩具放到自己的服务器中,但是感觉每次写完在本地交叉编译后上传到服务器略显麻烦,上传代码到服务器中编译也是略显麻烦,把编译文件加入到git管理中会导 ...

  5. iOS从gif获取图片数组

    iOS中,当我们UIImageView实现动画时,如果图片是gif则不会自动播放gif图片,我们可以从gif图片中读取出每一帧的图片,然后组成图片数组,之后再实现使用UIImageView实现动画效果 ...

  6. Essential C++学习笔记

    1.当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序栈”,这块特殊区域提供了每个函数参数的存储空间,它也提供函数所定义的每个对象的内存空间--我们将这些对象称为局部对象.一旦函数完成,这 ...

  7. JUnit 5和Selenium基础(三)

    在这一部分教程中,将介绍JUnit 5的其他功能,这些功能将通过并行运行测试,配置测试顺序和创建参数化测试来帮助减少测试的执行时间.还将介绍如何利用Selenium Jupiter功能,例如通过系统属 ...

  8. nacos-docker安装nacos并配置数据库

    拉取nacos/nacos-server镜像 docker pull nacos/nacos-server 配置数据库(MySQL) 创建存储nacos配置的数据库 create database n ...

  9. SpringBoot + Apache Shiro权限管理

    之前配置过Spring + SpringMVC + JPA + Shiro后台权限管理 + VUE前台登录页面的框架,手动配置各种.xml,比较繁琐,前几天写了个SpringBootShiro的Dem ...

  10. 区间dp - 全部按下一列石头

    There is one last gate between the hero and the dragon. But opening the gate isn't an easy task. The ...