A.GCD Path http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D%AFNOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B/GCD%20Path

题解:我想掀桌。。。

刚开始没思路,打了个30分的暴力把结果打出来,找规律。

发现x-y的最短路貌似就是 x/gcd(x,y)的质因数分解加起来?

果断 for 2 to sqrt()  枚举。。。。。。。。。。。。。。。。。。

还以为能AC,妈蛋,爆零了。。。。。。。。。。。。。。。。

你以为质因数分解是判素数????????????????

呵呵。。。。。。。 呵呵。。。。。。。。呵呵。。。。。。。

加上 if(x==1)ans+=x 瞬间50。。。。。。。。。。。。。。。。

加上 if(x==y)cout<<0<<endl 瞬间AC。。。。。。。。。。。。。

极度郁闷中。。。。。。。。。。。。。。。。。。。。。。。

如果我会用linux的diff的话大概会和暴力比较一下,结果只看了100的数据就以为对了。。。。

如果我10.30走的话也许会在对拍一下。。。。。。。。。。。

没办法,还是人太弱。。。。。。。。。。。。。。。。。。。

代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 500+100

 #define maxm 500+100

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
int n,m;
inline int gcd(int x,int y){return y?gcd(y,x%y):x;} int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read();
while(m--)
{
int x=read(),y=read(),t=(int)sqrt(x),ans=;
if(x==y){cout<<<<endl;continue;}
x/=gcd(x,y);if(x==){cout<<<<endl;continue;};
for2(i,,t)if(x%i==)
{
while(x%i==)x/=i,ans+=i;
}
if(x!=)ans+=x;
printf("%d\n",ans);
} return ; }

B.密室http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D%AFNOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B/%E5%AF%86%E5%AE%A4

题解:发现一个结论:只要开的门的集合相同,那么拥有的钥匙数一定相同。显然。。。

然后我们只需要判断能否到达每个门了。。。发现不会判囧。。。。。。。。。。

那BFS吧,既然写暴力就裸一点

x表示红的,y表示蓝的,z表示白的,w表示经过的点集合。。。。

会T?那到maxn break吧,估计能骗个5.60分。。。。。。。。。

成绩一下来逗逼了,90,这么照顾暴力。。。。。。。。。。。。。

代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 5000000

 #define maxm 500+100

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
struct rec1{int x,y,z;}a[],b[];
struct rec2{int x,y,z,w;}q[maxn];
int n; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();
for1(i,n)a[i].x=read();
for1(i,n)a[i].y=read();
for1(i,n)b[i].x=read();
for1(i,n)b[i].y=read();
for1(i,n)b[i].z=read();
int l=,r=;
q[++r].x=read(),q[r].y=read(),q[r].z=read(),q[r].w=;
int ans=q[r].x+q[r].y+q[r].z;
while(l!=r)
{
rec2 now=q[++l];if(l==maxn)break;
for1(i,n)
if((((now.w)&(<<(i-)))==)&&(max(a[i].x-now.x,)+max(a[i].y-now.y,)<=now.z))
{
q[++r].x=max(now.x-a[i].x,)+b[i].x;if(r==maxn)r=;
q[r].y=max(now.y-a[i].y,)+b[i].y;
q[r].z=now.z-max(a[i].x-now.x,)-max(a[i].y-now.y,)+b[i].z;
q[r].w=now.w+(<<(i-));
ans=max(ans,q[r].x+q[r].y+q[r].z);
}
}
printf("%d\n",ans); return ; }

C.数据备份http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D%AFNOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B/%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD

题解:发现x节点选了x-1和x+1都不能选,和cf某题比较像?

卧操!n=10W,k=5w,你在逗我?

算了,还是n*k的暴力算了,空间上用滚动就行了。。。

居然能拿65,是在补偿我第一题吗T_T

代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 150000

 #define maxm 500+100

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
int n,k,a[maxn],f[][maxn][]; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();k=read();
for1(i,n)a[i]=read();
for0(i,n)f[][i][]=f[][i][]=f[][i][]=f[][i][]=inf;
f[][][]=;
int t=;
for1(i,n-)
{
t=-t;
for0(j,(i>>)+)
{
f[t][j][]=f[t][j][]=inf;
if(j)f[t][j][]=f[-t][j-][]+a[i+]-a[i];
f[t][j][]=min(f[-t][j][],f[-t][j][]);
}
//for0(j,k)cout<<i<<' '<<j<<' '<<f[t][j][0]<<' '<<f[t][j][1]<<endl;
}
printf("%d\n",min(f[t][k][],f[t][k][])); return ; }

2.3正解待会儿补

UPD:我想上天台。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

卧操,我2题居然是正解,把maxn改成1000W就A了?????????????????????

T_T

代码:

 #include<cstdio>

 #include<cstdlib>

 #include<cmath>

 #include<cstring>

 #include<algorithm>

 #include<iostream>

 #include<vector>

 #include<map>

 #include<set>

 #include<queue>

 #include<string>

 #define inf 1000000000

 #define maxn 10000000

 #define maxm 500+100

 #define eps 1e-10

 #define ll long long

 #define pa pair<int,int>

 #define for0(i,n) for(int i=0;i<=(n);i++)

 #define for1(i,n) for(int i=1;i<=(n);i++)

 #define for2(i,x,y) for(int i=(x);i<=(y);i++)

 #define for3(i,x,y) for(int i=(x);i>=(y);i--)

 #define mod 1000000007

 using namespace std;

 inline int read()

 {

     int x=,f=;char ch=getchar();

     while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}

     while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}

     return x*f;

 }
struct rec1{int x,y,z;}a[],b[];
struct rec2{int x,y,z,w;}q[maxn];
int n; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();
for1(i,n)a[i].x=read();
for1(i,n)a[i].y=read();
for1(i,n)b[i].x=read();
for1(i,n)b[i].y=read();
for1(i,n)b[i].z=read();
int l=,r=;
q[++r].x=read(),q[r].y=read(),q[r].z=read(),q[r].w=;
int ans=q[r].x+q[r].y+q[r].z;
while(l!=r)
{
rec2 now=q[++l];if(l==maxn)break;
for1(i,n)
if((((now.w)&(<<(i-)))==)&&(max(a[i].x-now.x,)+max(a[i].y-now.y,)<=now.z))
{
q[++r].x=max(now.x-a[i].x,)+b[i].x;if(r==maxn)r=;
q[r].y=max(now.y-a[i].y,)+b[i].y;
q[r].z=now.z-max(a[i].x-now.x,)-max(a[i].y-now.y,)+b[i].z;
q[r].w=now.w+(<<(i-));
if(q[r].x+q[r].y+q[r].z>ans)ans=q[r].x+q[r].y+q[r].z;
}
}
printf("%d\n",ans); return ; }

好吧。真正的正解其实在这里。我的只不过能AC罢了。。。。。。。。

不理解,怎么能只访问一次就不走了呢,估计是数据弱?求大神指导

代码:

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 50000 + 5 int n, x, y, z, ans, door[][], key[][];
bool Open[N], Vis[N]; inline void dfs(int state, int r, int g, int w)
{
if (Vis[state]) return ;
ans = max(ans, r + g + w);
for (int i = ; i <= n; i ++)
if (!Open[i])
{
int _r = r - door[i][];
int _g = g - door[i][];
int _w = w + min(_r, ) + min(_g, );
if (_w < ) continue ;
_r = max(_r, ) + key[i][];
_g = max(_g, ) + key[i][];
_w += key[i][];
Open[i] = ;
dfs(state ^ ( << i - ), max(_r, ), max(_g, ), _w);
Open[i] = ;
}
Vis[state] = ;
} int main()
{
scanf("%d", &n);
for (int i = ; i < ; i ++)
for (int j = ; j <= n; j ++)
scanf("%d", door[j] + i);
for (int i = ; i < ; i ++)
for (int j = ; j <= n; j ++)
scanf("%d", key[j] + i);
scanf("%d%d%d", &x, &y, &z);
dfs(, x, y, z);
printf("%d\n", ans);
return ;
}

妈蛋,吐槽第二题,下面这程序都能AC,数据是有多弱,当时我本来就打算写这个。。。

代码:

 #include<stdio.h>
int a[],b[],c[],d[],e[];
int r,g,w,hh;
int main()
{
int n,i,ans=;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=n;i++)
scanf("%d",&b[i]);
for(i=;i<=n;i++)
scanf("%d",&c[i]);
for(i=;i<=n;i++)
scanf("%d",&d[i]);
for(i=;i<=n;i++)
scanf("%d",&e[i]);
scanf("%d %d %d",&r,&g,&w);
ans=r+g+w;
if(n==)
{
ans=r-a[]+g-b[]+w+c[]+d[]+e[];
if(ans<r+g+w+c[]+d[]+e[])
ans=r+g+w+c[]+d[]+e[];
}
for(i=;i<=n;i++)
{
if(c[i]+d[i]+e[i]-a[i]-b[i]>)ans=ans-a[i]-b[i]+c[i]+d[i]+e[i];
}
printf("%d",ans);
return ;
}

CH Round #53 -【Nescafé 32】杯NOIP模拟赛的更多相关文章

  1. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  2. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  3. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  4. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  5. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  6. 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

    10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...

  7. 【离散化】【扫描线】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的新书

    //上图绿色扫描线右侧少画了一条扫描线. 很多区间把数轴分成了很多段,看哪个点的(区间覆盖数*该点权值)最大. 显然在某个区间的右端点的答案是最优的. 排序后 用扫描线从左到右扫描,维护每个点的覆盖数 ...

  8. CH Round #59 - OrzCC杯NOIP模拟赛day1

    第一题:队爷的新书 题意简述:给定n个闭区间,求出一个数p使它与包含它的区间数的积最大,输出这个积. 分析:使用一个差分数组g,每个区间[l,r],l位置加1,r+1的位置减1,从前往后统计,得到对于 ...

  9. 【Nescafé 31】杯NOIP模拟赛

    t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于 ...

随机推荐

  1. SRM 586 DIV1

    A 考虑都是格点 , 枚举所有y+-0.5就行了. trick是避免正好在y上的点重复统计. class PiecewiseLinearFunction { public: int maximumSo ...

  2. 运营总监招聘-e袋洗招聘-拉勾网

    运营总监招聘-e袋洗招聘-拉勾网 运营总监

  3. 行内人解读开发一个App需要多少钱?

    对于很多互联网的创业者来说,评估前期的创业成本是很重要的.在这几年的创业大潮中,伴随着“互联网+”和“互联网思维”的普及,很多创业项目选择了开发app作为创业项目的载体.在我接触到的很多创业者,找Ap ...

  4. 【剑指Offer学习】【面试题56:链表中环的入口结点】

    题目:一个链表中包括环.怎样找出环的入口结点? 解题思路 能够用两个指针来解决问题.先定义两个指针P1和P2指向链表的头结点.假设链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以同样的 ...

  5. 一个封装HTTP请求的函数(C++)

    这里封装了HTTP请求的,支持GET与POST,并支持各种参数组合,调用方式很简单使用DEVWEB::WebRequest(string(“http://www.luaie.com/”),ret);就 ...

  6. paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt

    paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http:// ...

  7. java byte 16进制转换

    整型转16进制: int devIdInt = Integer.parseInt(devId);String devIdString = Integer.toHexString(devIdInt); ...

  8. CCSpawn使用CCRepeatForever无效

    在使用CCSpawn中加入CCRepeatForever,但却无法使用CCRepeatForever的效果. CCActionInterval* action =(CCActionInterval*) ...

  9. linux查看系统版本

       RHEL7.0以下,查看系统版本的方式: [rusky@rheltest1 ~]$ cat /proc/version Linux version -.el6.x86_64 (mockbuild ...

  10. vim的基本使用方法

    头记:vim作为被大多数程序员所推崇的编辑器,是源于它的自由灵活以及令人舒服的输入模式,但对于新手来说无疑是个噩梦(需要记太多的命令), 而作为使用了vim有一段时间的我来说,总结下常用的命令,以备新 ...