北京市迎春杯竞赛题,北京各区模拟及真题精选
【前言】这场比赛是昨天的训练赛,弱队最终做了四题,好像去年是铜牌滚粗。太弱啦。现在写一下部分题解。
【一片匈奴之地】http://7 xjob 4。com 1。z0。glb。云dn。com/3e 76 f 5 f 069 daf 5 f 6 fa 79969 c 155 E4 e 14
【题意】WQ和分为放射性废弃物厂房两个人立了攻,汉武帝要把一块沙漠(这片沙漠是有绿洲存在的)赏给这两个人,这片沙漠是正方形的方式存在的,并且给出了举行右上角的坐标(L,L),而且给出了n个绿洲的坐标,面积,现在汉武帝要用一根线把这片地划分成两个部分,使得左边的绿洲面积要大于等于右边的,并且他们之间的差距尽可能的小。询问这根线的位置,保证正整数。
【解题方法】比较水的题目了,想想就知道要维护一个前缀和的前缀和,这题就做完啦。
【交流代码】
#包括cstdio
#包括输入输出流
#包括字符串
使用命名空间标准
#定义LL龙龙
常数int N=2e6
LL pre[N];
int main()
{
int T,left,top,w,h,R,n;
所有金额;
scanf(%d ,T);
while(T - ){
memset(pre,0,sizeof(pre));
scanf(%d%d ,R,n);
总和=0;
for(int I=0;I n;i ){
scanf(%d%d%d%d ,左,上,宽,高);
w=min(w,R-左);
h=min(h,top);
前[左1]=h;
前[左w1]-=h;
//sum[left w 1]-=1ll * w * h;
sums=1ll * w * h;
}
for(int I=1;I=R;i ){
pre[I]=pre[I-1];
}
for(int I=1;I=R;i ){
pre[I]=pre[I-1];
}
int ans=0;
LL Minn=0x 3 F3 F3 f 3 f
for(int I=1;I=R;i ){
if(pre[I]=(sums-pre[I])pre[I]-(sums-pre[I])=Minn){
ans=I;
Minn=pre[I]-(sums-pre[I]);
}
}
printf(%d\n ,ans);
}
返回0;
}
【今天是个雨天赛后补题】
https://icpcarchive.ecs.baylor.edu/index.php?option=com _ online judge Itemid=8 page=show _ problem problem=5275
【题意】给了2个数字串a和数字串b,并且这些串里最多有1-6这6个数字,现在有两种操作,一种是把串里的某一个数字全部变成另外一个数字,另一种操作是把串里某一个位置上的数字变成另一个数字,问把b串通过这两个操作变成a串最少需要多少步?
【解题方法】只要想到,全部变比一个变肯定来得优,然后我们需处理代价这题就可以做出来了。后面的代价可以直接算嘛,然后维护最小代价就好啦。
【交流代码】
#包括队列
#包括cstdio
#包括字符串
#包括输入输出流
#包含算法
使用命名空间标准
const int maxn=50005
const int INF=0x 3 F3 F3 F3 f;
int DP[maxn];
int getid1(int *c){
int ret=0;
for(int I=0;i6;i ){
ret=ret * 6 c[I];
}
返回浸水使柔软
}
void getid2(int s,int *c)
{
for(int I=5;I=0;我- ){
c[I]=s % 6;
s/=6;
}
}
空的预求解()
{
int c[10],t[10];
for(int I=0;i6;I)c[I]=I;
int s=getid 1(c);
memset(dp,inf,sizeof(DP));
DP[s]=0;
队列int que
阙。推送;
while(que.size())
{
s=que。front();
阙。pop();
getid2(s,c);
for(int I=0;i6;i ){
for(int j=0;j 6;j ){
memcpy(t,c,sizeof(t));
for(int k=0;K6;k)if(t[k]==I)t[k]=j;
int v=getid 1(t);
if(dp[v] dp[s] 1){
DP[v]=DP[s]1;
阙。推(v);
}
}
}
}
}
int cnt1[10],CNT 2[10][10];
char a[120],b[120];
int main()
{
presolve();
while(scanf(%s ,a)!=EOF)
{
scanf(%s ,b);
int len=strlen(a);
memset(cnt1,0,sizeof(cn t1));
memset(cnt2,0,sizeof(CNT 2));
for(int I=0;我leni ){
cn t1[b[I]- 1 ];
CNT 2[b[I]-1 ][a[I]-1 ];
}
int ans=inf
int t[10];
for(int s=0;s maxns ){
getid2(s,t);
int now=DP[s];
for(int I=0;i6;i ){
now=cn t1[I]-cn T2[I][t[I]];
}
ans=min(ans,现在);
}
printf(%d\n ,ans);
}
返回0;
}【萨克勒博物馆里的神秘古董】https://icpcarchive.ecs.baylor.edu/index.php?option=com _ online judge Itemid=8 page=show _ problem problem=5279
【题意】给四个矩形的宽和高,问能否选出3个拼成一个大矩形
【解题方法】简单模拟,不要漏情况就好,这题队友写的,很稳。
【交流代码】
#包括cstdio
使用命名空间标准
结构节点
{
int h,w;
} a[4];
int isok()
{
for(int I=0;I 4;i ){
int flag=0;
for(int j=0;j 4;j ){
如果(j==i)继续;
如果(a[j]).h==a[0].ha[j].w==a[0].h)继续;
其他标志=1;
}
如果(标志==0)返回1;
flag=0;
for(int j=0;j 4;j ){
如果(j==i)继续;
如果(a[j]).w==a[0].wa[j].h==a[0].w)继续;
其他标志=1;
}
如果(标志==0)返回1;
}
返回0;
}
int check()
{
for(int I=0;I 4;i ){
for(int j=0;j 4;j ){
int t1=-1,T2=-1;
如果(i==j)继续;
for(int k=0;k4;k ){
如果(k==jk==i)继续;
if(t1==-1){
t1=k;
for(int x=0;x 4;x ){
if(x==jx==t1x==i)继续;
T2=x;
}
打破;
}
}
if(a[t1].h==a[t2].w (a[t1]).瓦特[t2].h==a[j].ha[t1].瓦特[t2].h==a[j].w))返回1;
if(a[t1].h==a[t2].h (a[t1]).瓦特[t2].w==a[j].ha[t1].瓦特[t2].w==a[j].w))返回1;
if(a[t1].w==a[t2].w (a[t1]).哈哈[t2].h==a[j].ha[t1].哈哈[t2].h==a[j].w))返回1;
if(a[t1].w==a[t2].h (a[t1]).哈哈[t2].w==a[j].ha[t1].哈哈[t2].w==a[j].w))返回1;
}
}
返回0;
}
int main()
{
int T;
scanf(%d ,T);
while(T - ){
scanf(%d%d%d%d%d%d%d%d ,a[0].h,a[0].w,a[1].h,a[1].w,a[2].h,a[2].w,a[3].h,a[3].w);
if(isok())printf( Yes \ n );
else if(check())printf( Yes \ n );
else printf( No \ n );
}
返回0;
}
【我蛇毯】https://icpcarchive.ecs.baylor.edu/index.php?option=com _ online judge Itemid=8 page=show _ problem problem=5281
【题意】给一个数n,然后现在对于一对多的每一个数我,你都可以用这我个相同的数字我构成一条长度为我的蛇,要满足一个条件,就是2的偶数的转弯必须是偶数,奇数必须是奇数。
【解题方法】队友在纸上画了一下,感觉是蛇形填数,乱扒了几组样例,感觉还是挺妥的,就开始敲了,不过这题我们调试了很久,中间下标什么很烦,orz。
【交流代码】
#包括cstdio
#包含算法
使用命名空间标准
结构节点
{
int x,y;
};
节点ans[1000][1000];
int numm[1000];
void f(int n,int x,int y)
{
如果(n=0)返回;
if(n==1){
printf(%d %d\n ,x,y);
返回;
}
if(n%2==0){
f(n-1,x,y ^ 2);
int i=x,j=y,k,flag=0;
for(k=0;k n/2;k,i - ){
if(flag==0) printf(%d %d ,I,j),flag=1;
else printf( %d %d ,I,j);
}
我;
for(k=0,j;k n/2;k,i ){
if(flag==0) printf(%d %d ,I,j),flag=1;
else printf( %d %d ,I,j);
}
printf( \ n );
}
else if(n=3){
f(n-3,x,y ^ 2);
int i=x,j=y,k,cnt=0,num
num=0;
for(k=0;k(^北部1)/2;k,i - ) ans[cnt][num ]=(node){i,j };
我;
for(k=0,j;k n/2;k,j ) ans[cnt][num ]=(node){i,j };
numm[CNT]=num;
j-;
num=0;
for(k=0,j;k(n-1)/2;k,j ) ans[cnt][num ]=(node){i,j };
j-;
for(i,k=0;k(n-1)/2;k,j - ) ans[cnt][num ]=(node){i,j };
numm[CNT]=num;
j;
num=0;
for(k=0,j-;k(n-2)/2 ^;k,j - ) ans[cnt][num ]=(node){i,j };
j;
for(k=0,I;k(n-2)/2;k,i ) ans[cnt][num ]=(node){i,j };
numm[CNT]=num;
for(int I=CNT-1;I=0;我- ){
for(int j=0;j numm[I];j ){
if(j==0) printf(%d %d ,ans[i][j].x,ans[i][j].y);
else printf( %d %d ,ans[i][j].x,ans[i][j].y);
}
printf( \ n );
}
}
}
int main()
{
int n;
while(~scanf(%d ,n)){
if(n%2==0) printf(%d %d\n ,n/2,n ^ 1);
else printf(%d %d\n ,(n ^ 1)/2,n);
if(n%2==0) f(n,n/2,1);
else f(n,(n ^ 1)/2,1);
}
返回0;
}
【
J - Osu!主人】
https://icpcarchive.ecs.baylor.edu/index.php?option=com _ online judge Itemid=8 page=show _ problem problem=5282
【题意】不是太懂,我直接看样例,猜了个结论秒过,我的结论就是连续上升的数字或者s的和。
【解题方法】如上。
【交流代码】
#包括cstdio
#包括字符串
#包括输入输出流
#包含算法
使用命名空间标准
int n;
int main()
{
while(scanf(%d ,n)!=EOF)
{
int x;
char op[3];
int ans=0;
int last=-1;
for(int I=0;I n;i ){
scanf(%s ,op);
if(op[0]==S){
美国国家标准(American National Standards的缩写)
last=-1;
}否则{
scanf(%d ,x);
如果(x倒数第一!=-1){
last=x;
继续;
}否则{
美国国家标准(American National Standards的缩写)
last=x;
}
}
}
printf(%d\n ,ans);
}
返回0;
}
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。