A .Assignments

题意:给定距离D,以及N个飞机的速度Vi,单位时间耗油量Fi,总油量Ci。问有多少飞机可以到达目的地。

思路:即问多少飞机满足(Ci/Fi)*Vi>=D  ---->  Ci*Vi>=Fi*D;

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int main()
{
int T,N,f,v,c,D,ans;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&D); ans=;
rep(i,,N){
scanf("%d%d%d",&v,&f,&c);
if(f*v>=D*c) ans++;
}
printf("%d\n",ans);
}
return ;
}

B .Bones’s Battery

题意:N城市,M条双向带权路(权值表示耗电量),满足他们连通。 每个城市可以给电车充满电。 现在需要一种电车,满足任意路线(即任意点到任意点),它充电的次数不超过K。 一开始车的没电的,即起点必须充电。

思路:先Floyd求得两两最短路。 然后我们把dis小于电车电量的路径距离看为1,然后需要满足任意点对距离不大于K。显然就是一个二分+Floyd。

二分的时候可以直接二分[1,inf]; 复杂度O(N^3*loginf).

优化:二分的这个电量,一定是其中两点间距离,我们我们把点对距离排序,然后对他们二分即可。 复杂度O(2*N^3*logN);

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const ll inf=;
int N,M,K;ll dis[maxn][maxn],dp[maxn][maxn];
bool check(ll Mid)
{
rep(i,,N)
rep(j,,N) dp[i][j]=(dis[i][j]>Mid?inf:);
rep(k,,N)
rep(i,,N)
rep(j,,N)
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
rep(i,,N)
rep(j,i+,N)
if(dp[i][j]>K) return false;
return true;
}
int main()
{ int T,u,v;ll w;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&N,&K,&M);
rep(i,,N) rep(j,,N) dis[i][j]=inf;
rep(i,,M){
scanf("%d%d%lld",&u,&v,&w); u++; v++;
dis[u][v]=min(dis[u][v],w);
dis[v][u]=min(dis[v][u],w);
}
rep(k,,N)
rep(i,,N)
rep(j,,N)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
ll L=,R=inf,Mid,ans;
while(L<=R){
Mid=(L+R)/;
if(check(Mid)) ans=Mid,R=Mid-;
else L=Mid+;
}
printf("%lld\n",ans);
}
return ;
}

C .Crusher’s Code

题意:给定长度为N的序列a[];

Alice每次随机选择一个i,j;如果a[min(i,j)]>a[max(i,j)],则交换他们两个。

Bob每次随机选择一个i(i<N);如果a[i]>a[i+1],则交换他们两个。

思路:然后是一个有限状态的数学期望DP,我们可以记忆化搜索。 把a数组看成一个N位数,假设为x,那么每次它要么不变,要么变小。

对于Alice和Bob,我们可以列出方程 :dp[x]=(dp[a]+dp[b]+dp[c]+dp[d]....dp[cnt])/cnt+1;其中abcd...是x能到达的状态。

显然总状态数小于N!~4e4;我们可以过,假设map保存dp值,复杂度O(N!*log);

优化:我们可以把map换为康拓展开,这样可以优化掉一个log。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int a[],b[],f[],N,Tar;
map<int,double>mp;
double dfs1(int x)
{
if(x==Tar) return ;
int c[];
if(mp.find(x)!=mp.end()) return mp[x];
double res=; int cnt=,tx=x;
for(int i=N;i>=;i--) c[i]=tx%,tx/=;
rep(i,,N)
rep(j,,N){
int mn=min(i,j),mx=max(i,j);
if(c[mn]>c[mx]) res+=dfs1(x-(c[mn]*f[N-mn]+c[mx]*f[N-mx])+(c[mx]*f[N-mn]+c[mn]*f[N-mx]));
else cnt++;
}
return mp[x]=(res+N*N)/(N*N-cnt);
}
double dfs2(int x)
{
if(x==Tar) return ;
int c[];
if(mp.find(x)!=mp.end()) return mp[x];
double res=; int cnt=; int tx=x;
for(int i=N;i>=;i--) c[i]=tx%,tx/=;
rep(i,,N-) {
int mn=i,mx=i+;
if(c[mn]>c[mx]) res+=dfs2(x-(c[mn]*f[N-mn]+c[mx]*f[N-mx])+(c[mx]*f[N-mn]+c[mn]*f[N-mx]));
else cnt++;
}
mp[x]=(res+N-)/(N--cnt);
return mp[x];
}
int main()
{
int T; scanf("%d",&T);
f[]=; rep(i,,) f[i]=f[i-]*;
while(T--){
scanf("%d",&N);
rep(i,,N) scanf("%d",&a[i]),b[i]=a[i];
sort(b+,b+N+);
int tot=unique(b+,b+N+)-(b+);
rep(i,,N) a[i]=lower_bound(b+,b+tot+,a[i])-b;
int x=; rep(i,,N) x=x*+a[i],b[i]=a[i];
sort(b+,b+N+);
Tar=; rep(i,,N) Tar=Tar*+b[i];
mp.clear(); double ans1=dfs1(x);
mp.clear(); double ans2=dfs2(x);
printf("Monty %.6lf Carlos %.6lf\n",ans1,ans2);
}
return ;
}

D .Delta Quadrant

题意:给定大小为N的一棵带权树,让你找一条最快的路径,遍历至少N-K个点,然后回到起点,K<=20。

思路:树型DP,dp[i][j]表示选择以i为根的子树,子树里有j个点不选的最小权值和。

和一般的树DP做背包不一样,这里必须选一个,所以我们用一个临时数组tmp来更新。

更新答案的时候,选择的连通块的根也不一定是1号节点。

复杂度O(N*K^2);

#include<bits/stdc++.h>
#define ll long long
#define rep2(i,a,b) for(int i=a;i>=b;i--)
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=1e9;
int Laxt[maxn],Next[maxn],To[maxn],Len[maxn];
int dp[maxn][],tmp[],sz[maxn],cnt,K;
void add(int u,int v,int w)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
void dfs(int u,int f)
{
rep(i,,K) dp[u][i]=;
dp[u][]=; sz[u]=;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i]; if(v==f) continue;
dfs(v,u); sz[u]+=sz[v];
rep(j,,K) tmp[j]=inf;
rep(j,,min(sz[v],K)){
rep2(k,K,j)
tmp[k]=min(tmp[k],dp[u][k-j]+dp[v][j]+(j==sz[v]?:Len[i]));
}
rep(j,,K) dp[u][j]=tmp[j];
}
}
int main()
{
int T,N,u,v,w; scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&K);
cnt=; rep(i,,N) Laxt[i]=;
rep(i,,N-) {
scanf("%d%d%d",&u,&v,&w);
u++; v++;
add(u,v,w); add(v,u,w);
}
dfs(,); int ans=dp[][];
rep(i,,K) ans=min(ans,dp[][K]);
rep(i,,N) rep(j,,K-(N-sz[i])) ans=min(ans,dp[i][j]);
printf("%d\n",ans*);
}
return ;
}

E .Enterprising Escape

题意:给定N*M的迷宫,迷宫由大写字母组成,每种不同的字母对应穿过这个格子的时间,‘E’是起点,问从起点走到迷宫边界的最小时间。

思路:没有负权,所以直接BFS或者跑最短路即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=1e9;
int dis[maxn][maxn],inq[maxn][maxn],id[maxn],C,N,M,Sx,Sy,ans;
int dx[]={,,,-},dy[]={,,-,};char c[maxn][maxn];
struct in{
int x,y,d;
in(){}
in(int xx,int yy,int dd):x(xx),y(yy),d(dd){}
bool friend operator<(in w,in v){ return w.d>v.d; }
};
void dijs()
{ rep(i,,N) rep(j,,M) dis[i][j]=inf,inq[i][j]=;
dis[Sx][Sy]=; priority_queue<in>q;
q.push(in(Sx,Sy,));
while(~q.empty()){
int x=q.top().x,y=q.top().y; q.pop(); inq[x][y]=;
if(x==||x==N||y==||y==M){
ans=dis[x][y]; return;
}
rep(i,,){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=&&tx<=N&&ty>=&&ty<=M&&dis[tx][ty]>dis[x][y]+id[c[tx][ty]]){
dis[tx][ty]=dis[x][y]+id[c[tx][ty]];
if(!inq[tx][ty]) inq[tx][ty]=,q.push(in(tx,ty,dis[tx][ty]));
}
}
}
}
int main()
{
int T,x; char s[];
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&C,&M,&N);
rep(i,,C){
scanf("%s",s); scanf("%d",&x);
id[s[]]=x;
}
rep(i,,N) scanf("%s",c[i]+);
rep(i,,N) rep(j,,M) {
if(c[i][j]=='E') {
Sx=i; Sy=j; break;
}
}
dijs();
printf("%d\n",ans);
}
return ;
}

F .Federation Favorites

题意:问一个数是否是真因子(不含本身的因子)之和。

思路:根号分解即可。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=;
int tot,a[maxn],b[maxn],tot2;
int main()
{
int N;
while(~scanf("%d",&N)&&N!=-){
int res=; a[tot=]=; tot2=;
for(int i=;i*i<=N;i++){
if(N%i==) {
res+=i; a[++tot]=i;
if(i*i!=N) res+=N/i,b[++tot2]=N/i;
}
}
if(res!=N) printf("%d is NOT perfect.\n",N);
else {
printf("%d = %d",N,);
rep(i,,tot) printf(" + %d",a[i]);
rep2(i,tot2,) printf(" + %d",b[i]);
puts("");
}
}
return ;
}

G .Generations of Tribbles

题意:给一个递推式,求第N项。

思路:模拟。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep2(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int maxn=;
ll a[maxn]; int N,T;
int main()
{
a[]=a[]=; a[]=; a[]=;
rep(i,,) a[i]=a[i-]+a[i-]+a[i-]+a[i-];
scanf("%d",&T);
while(T--){
scanf("%d",&N);
printf("%llf\n",a[N]);
}
return ;
}

H .Holodeck Hacking

题意:rev(X)是把X的各个数位倒序过来,给定Y,问多少X满足X+rev(X)=Y;Y<1e18;

思路:假设X=abcd,那么X+rev(X)=(a+d)(b+c)(b+c)(a+d),然后进位。    即在不进位的情况下是对称的。那么我们枚举不进位的情况下的右半部分,然后对称到左半部分,然后考虑进位,进位后如果值为Y,然后分别考虑每一位的贡献。

这样的话复杂度是O(2^((L+1)/2);  然后累乘每一位的贡献即可。 估计数位DP也可以做,但是复杂度一样。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int a[maxn],b[maxn],c[maxn],tot;ll x,ans;
void dfs(int L,int pos,int p)
{
if(pos==(L+)/+){
for(int i=pos;i<=L;i++) b[i]=b[L+-i];
for(int i=;i<=tot+;i++) c[i]=;
for(int i=;i<=L;i++){
c[i]+=b[i];
c[i+]=c[i]/;
c[i]%=;
}
if(c[tot+]) return ;
for(int i=;i<=tot;i++) if(c[i]!=a[i]) return ;
ll res;
if(b[]<){
if(L==) res=b[]&?:;
else res=b[];
}
else {
if(L==) res=b[]&?:;
else res=-b[];
}
for(int i=;i<pos;i++){
if(b[i]<){
if(L+-i==i) res*=b[i]&?:;
else res*=1LL*(b[i]+);
}
else{
if(L+-i==i) res*=b[i]&?:;
else res*=1LL*(-b[i]);
}
}
ans+=res;
return ;
}
if(a[pos]-p>=) b[pos]=a[pos]-p,dfs(L,pos+,);
b[pos]=a[pos]-p+; dfs(L,pos+,);
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%lld",&x); tot=; ans=;
while(x) a[++tot]=x%,x/=;
dfs(tot,,);
if(a[tot]==) dfs(tot-,,);
printf("%lld\n",ans);
}
return ;
}

I .Interstellar Trade

题意:X轴有处于整点的N个点, 现在你可以任选两个点(不一定在整点上),使得这两个点可以互相瞬移,求最小化最大距离。

思路:比赛的时候写了个O(N^3)的代码,显然过不去,然后乱改成N^2的假代码,瞎交了一发,估计是数据水了A了。

(下面的别人的代码,还未理解。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int N,a[maxn];
int main()
{
int T,ans;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
rep(i,,N) scanf("%d",&a[i]);
sort(a+,a+N+); ans=;
rep(i,,N) ans=max(ans,min(a[N]-a[i],a[i]-a[]));
printf("%d\n",ans);
}
return ;
}

Gym 101655:2013Pacific Northwest Regional Contest(寒假自训第13场)的更多相关文章

  1. Gym.101955: Asia Shenyang Regional Contest(寒假自训第10场)

    C.Insertion Sort 题意:Q次询问,每次给出N,M,Mod,问你有多少种排列,满足前面M个数字排序之后整个序列的LIS>=N-1. 思路:我们把数字看成[1,M],[N-M+1,N ...

  2. Gym101986: Asia Tsukuba Regional Contest(寒假自训第12场)

    A .Secret of Chocolate Poles 题意:有黑白两种木块,黑色有1,K两种长度: 白色只有1一种长度,问满足黑白黑...白黑形式,长度为L的组合种类. 思路:直接DP即可. #i ...

  3. Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)

    学习了“叙利亚”这个单词:比较温和的一场:几何的板子eps太小了,坑了几发. A .Hello SCPC 2018! 题意:给定一个排列,问它是否满足,前面4个是有序的,而且前面4个比后面的都小. 思 ...

  4. Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)

    B .Counting Inversion 题意:给定L,R,求这个区间的逆序对数之和.(L,R<1e15) 思路:一看这个范围就知道是数位DP. 只是维护的东西稍微多一点,需要记录后面的各种数 ...

  5. Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)

    这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...

  6. 2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

    2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) 思路: A Exam 思路:水题 代码: #include<bits ...

  7. 2018 ICPC Pacific Northwest Regional Contest I-Inversions 题解

    题目链接: 2018 ICPC Pacific Northwest Regional Contest - I-Inversions 题意 给出一个长度为\(n\)的序列,其中的数字介于0-k之间,为0 ...

  8. Gym 101889:2017Latin American Regional Programming Contest(寒假自训第14场)

    昨天00.35的CF,4点才上床,今天打的昏沉沉的,WA了无数发. 题目还是满漂亮的. 尚有几题待补. C .Complete Naebbirac's sequence 题意:给定N个数,他们在1到K ...

  9. Gym - 101615J Grid Coloring DP 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)

    题目传送门 题目大意: 给出n*m的网格,有红蓝两种颜色,每个格子都必须被染色,当一个格子被染成蓝色后,这个格子左上方的一块都必须被染成蓝色,问最后的方案数量. 思路: 按照题目条件,如果有一个格子被 ...

随机推荐

  1. Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符

    1.pyc简介 python程序在运行时也有编译过程,编译后会产生.pyc文件.这是一种由python虚拟机执行的二进制文件(字节码),用于保存内存中PyCodeObject,以便加快程序的加载运行. ...

  2. Python3+pdfminer+jieba+wordcloud+matplotlib生成词云(以深圳十三五规划纲要为例)

    一.各库功能说明 pdfminer----用于读取pdf文件的内容,python3安装pdfminer3k jieba----用于中文分词 wordcloud----用于生成词云 matplotlib ...

  3. Linux+Apache+MySQL+PHP配置教程

    有时我们只想搭建LAMP环境做个测试,并不在意目录的和配置是否规范,本教程正是为此想法而写能简单的就不复杂实现最快地搭建LAMP:操作系统为CentOS6.5. 1.安装Apache yum inst ...

  4. memory prefix mini mono multi out _m 5

      1● mini 小 迷你   2● mono 单一 ,单   3● multi 多

  5. Boost中的网络库ASIO,nginx

    boost C++ 本身就是跨平台的,在Linux.Unix.Windos上都可以使用. Boost.Asio  针对网络编程,很多服务端C++开发使用此库. 这个库在以下的平台和编译器上测试通过: ...

  6. commons-logging 与log4j的关系

    参考:http://zachary-guo.iteye.com/blog/361177

  7. django 中下载文件与下载保存为excel

    一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...

  8. sql语句最后一行显示统计。

    SELECT id, username, id_Num FROM users UNION ALL SELECT '合计', count(*), null FROM users ORDER BY id_ ...

  9. mysql存储过程中使用游标

    用户变量一般以@开头,作用于全局范围 局部变量需用 declare 定义格式为 declare 变量名 数据类型 [default value]; mysql 数据类型有 int ,float,dat ...

  10. PE文件 01 导入表

    0x01  导入表结构  数据目录表中的第二个成员标记了导入表的RVA和Size大小,由此可以定位到导入表: typedef struct _IMAGE_DATA_DIRECTORY { DWORD ...