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. 微信小程序初见+nodejs服务端 (一个简单的博客)

    推荐网址: 腾讯云快速开发(nodejs前后端):https://developers.weixin.qq.com/miniprogram/dev/qcloud/qcloud.html#%E5%AF% ...

  2. dump_stack使用

    我们在调试内核时可以用printk打印信息.但有时我们不知道一个函数或者一个模块到底在哪里出了问题.这时我们可以用dump_stack打印信息,查看函数调用关系,找到问题的根源.使用实例: hello ...

  3. Unity中Text中首行缩进两个字符和换行的代码

    1.首行缩进两个字符 txt.text=“\u3000\u3000” + str: 2.首行缩进两个字符 将输入法换成全角的,在Text属性面板中添加空格即可. 3.换行    “\n” 补充 Uni ...

  4. python使用变量

    #不建议用加号,建议用.format name = input('name:') age = input('age:') print( name ,age) print('姓名:',name,'年龄: ...

  5. js正则学习

    一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之. 但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记. ...

  6. mysql存储过程造数

    性能测试时,数据库表通常需要很多数据,此时我们可以用存储过程来造数,以下代码mysql.Oracle都可以用 首先,先查看数据库表的设计,可以看到每张表有多少字段,分别都是什么类型,哪个字段是自动增长 ...

  7. Linux alias别名命令

    首先介绍一下命令的别名,怎么查看的呢? 咱们使用which命令就可以查看的到它完整的命令是怎样的 [root@master ~]# which ls alias ls='ls --color=auto ...

  8. 人生苦短,我用python,为什么选择python,python简介

    认识 Python 人生苦短,我用 Python —— Life is short, you need Python  目标 Python 的起源 为什么要用 Python? Python 的特点 ...

  9. 日志框架elk 搭建

    CENTOS7 安装 NGINX ELK之LOGSTASH ELK之ELASTICSEARCH安装 ELK之KIBANA

  10. CodeForces - 780C Andryusha and Colored Balloons(dfs染色)

    Andryusha goes through a park each day. The squares and paths between them look boring to Andryusha, ...