题目在这里>_<

发现这场比赛在网上没有完整的题解,甚至连题目代码都没人贴出来(大概是因为题目太水了吧。。。)。所以宝宝就来写个题解,也就当作成长记录了233333

A. Window

题意很简单,给出n组x,y,求x*y的值

 #include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int n;
long long x,y;
scanf("%d",&n);
while(n--)
{
scanf("%I64d%I64d",&x,&y);
printf("%I64d\n",x*y);
}
return ;
}

B. Paper Game

两个人撕纸片玩,会发现其实能够撕的次数就是x*y,所以就很简单啦^_^

 #include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int t;
int x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&x,&y);
if((x*y)&)
printf("Hussain\n");
else
printf("Hasan\n");
}
return ;
}

C. Rectangles

计数,由于数据范围比较小,O(n)就能过了,根本不需要树状数组线段树神马的。把题目改为输入i,j,k,s再把数据范围改大一点,就需要二维树状数组了。

 #include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax=;
int high[Nmax];
int t,n,z,x,y,ans;
void init()
{
ans=;
for(int i=;i<Nmax;i++)
high[i]=; } int main()
{
//freopen("c.in","r",stdin);
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&z,&x,&y);
for(int i=z+;i<=x;i++)
high[i]=max(high[i],y);
}
for(int i=;i<Nmax;i++)
ans+=high[i];
printf("%d\n",ans);
}
return ;
}

D. Sequences

求元素间恰好只差1的最长上升子序列,英语渣表示读题的时候没读懂一定要只差1,然后各种看不懂样例2333333  我们知道条件限制越多就越好写,所以必须只差1的话,用dp[i]记录到值为i的元素的最长上升子序列,因此dp[i]=max(dp[i],dp[i-1]+1),O(n)水过。

 #include<cstdio>
#include<algorithm>
using namespace std;
const int Nmax=;
int dp[Nmax];
int t,n,x,ans;
int main()
{
//freopen("d.in","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ans=;
for(int i=;i<Nmax;i++)
dp[i]=;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
dp[x]=max(dp[x],dp[x-]+);
ans=max(ans,dp[x]);
}
printf("%d\n",ans);
}
return ;
}

E. Napoléon

问在8*8的棋盘上,一个只能斜着走的棋子从某点到另一点的最小步数。

只能斜着走的话,显然(x+y)的奇偶性相同才能互相到达。虽然是斜着走,但是每次都能向目标方向靠近一个单位,所以最小步数就是max(|x1-x2|,|y1-y2|) 。

 #include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int Nmax=;
int dis[Nmax][Nmax];
int n,t;
int xs,ys,xe,ye;
int get_num(int x,int y)
{
return (x-)*n+y;
}
int abs(int x)
{
if(x<)
return -x;
return x;
}
int main()
{
//freopen("e.in","r",stdin);
scanf("%d%d",&t,&n);
while(t--)
{
scanf("%d%d%d%d",&xs,&ys,&xe,&ye);
xs++,ys++,xe++,ye++;
// printf("%d %d %d %d\n",xs,ys,xe,ye);
// printf("%d %d\n",(xs+ys)&1,(xe+ye)&1);
if( ((xs+ys)&)!=((xe+ye)&) )
printf("can't reach!\n");
else
printf("%d\n",max( abs(xs-xe),abs(ys-ye) ));
}
return ;
}

F. The Best Strategy

又死在了英语上ψ(╰_╯) 做了这题我才知道罚时是怎么算的。。。然而题目里没告诉罚时怎么算,所以又是看不懂样例系列。原来总罚时就是每道题在比赛中的完成时间之和。所以排个序模拟一下就好了。

 #include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax=;
int num[Nmax];
int sum,ans,number,now;
void init()
{
sum=ans=number=now=;
} int main()
{
int t,n;
//freopen("f.in","r",stdin);
scanf("%d",&t);
for(int k=;k<=t;k++)
{
scanf("%d",&n);
init();
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
sort(num+,num+n+);
for(int i=;i<=n;i++)
{
if(now+num[i]<=)
{
now=now+num[i];
sum+=now;
number++;
}
else
break;
}
printf("Case %d: %d %d\n",k,number,sum);
}
}

G. Cutie Pie

找到一堆字符里面的“pie”,思路很简单,暴力BFS就好啦~

 #include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int Nmax=;
char map[Nmax][Nmax];
int t,n,m,nowx,nowy,kkk,nowxx,nowyy;
int dx[]={-,-,-, ,, ,,};
int dy[]={-, , ,-,,-,,};
struct Node
{
int x;
int y;
}p;
queue<Node> q; int get_num(int x,int y)
{
return (x-)*m+y;
} void init()
{
while(!q.empty())
q.pop();
} int main()
{
//freopen("g.in","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
getchar();
map[i][j]=getchar();
if(map[i][j]=='p')
q.push((Node){i,j});
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// printf("%c ",map[i][j]);
// printf("\n");
// }
// while(!q.empty())
// {
// p=q.front();
// q.pop();
// printf("%d %d\n",p.x,p.y);
// }
int ans=;
while(!q.empty())
{
if(ans)
break;
p=q.front();
q.pop();
for(int i=;i<;i++)
{
if(ans)
break;
nowx=p.x+dx[i],nowy=p.y+dy[i];
kkk=get_num(nowx,nowy);
if(kkk>= && kkk<=n*m && map[nowx][nowy]=='i')
{
for(int j=;j<;j++)
{
nowxx=nowx+dx[j],nowyy=nowy+dy[j];
kkk=get_num(nowxx,nowyy);
if(kkk>= && kkk<=n*m && map[nowxx][nowyy]=='e')
{
ans=;
break;
}
}
}
}
}
if(ans)
printf("Cutie Pie!\n");
else
printf("Sorry Man\n");
}
return ;
}

H. Weekend

问一个人从起点到终点接上所有朋友的最短时间。先把每两个点间的最短距离求出来,再对所有的朋友点跑一个记忆化搜索。因为朋友数很少,状态压缩一下记录所有的状态,再用dp[i][j]记录到点i时状态j的最短时间,就搞定啦ヾ(*´▽‘*)ノ 然而我居然漏写了一个等号,然后一直TLE 23333

 #include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax=;
const int INF=1e9;
int ans,ans_min;
int dis[Nmax][Nmax];
int map[Nmax][Nmax];
int x,y,w,n,m,f;
int num[Nmax];
int book[Nmax],step; void init()
{
ans=;
step=;
ans_min=INF;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=INF;
for(int i=;i<=n;i++)
dis[i][i]=num[i]=book[i]=;
} void dfs(int now)
{
if(now==f+)
{
if(step==f+)
ans_min=min(ans_min,ans);
return;
} for(int i=;i<=f+;i++)
{
if(dis[num[now]][num[i]]<INF)
{
if(!book[i])
{
ans+=dis[num[now]][num[i]];
step++;
book[i]=;
dfs(i);
ans-=dis[num[now]][num[i]];
step--,book[i]=;
}
else
{
ans+=dis[num[now]][num[i]];
dfs(i);
ans-=dis[num[now]][num[i]];
} }
}
} int main()
{
freopen("h.in","r",stdin);
int t;
scanf("%d",&t);
for(int k=;k<=t;k++)
{
scanf("%d%d%d",&n,&m,&f);
init();
printf("Case %d: \n",k);
while(m--)
{
scanf("%d%d%d",&x,&y,&w);
dis[x][y]=dis[y][x]=map[x][y]=map[y][x]=w;
}
for(int tmp=;tmp<=n;tmp++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(dis[i][tmp]+dis[tmp][j]<dis[i][j])
dis[i][j]=dis[i][tmp]+dis[tmp][j];
}
}
}
num[]=;
book[]=,step++;
for(int i=;i<=f+;i++)
scanf("%d",&num[i]);
num[f+]=n;
dfs();
printf("%d\n",ans_min);
}
return ;
}

I. Playing With Strings

模拟模拟!

 #include <cstdio>
#include <algorithm>
#include <string.h>
using namespace std;
const int Nmax=;
char ans[Nmax];
int n,t,now;
int num[];
char s[Nmax];
char c;
void init()
{
now=;
for(int i=;i<=n+;i++)
ans[i]='\0';
for(int i=;i<;i++)
num[i]=;
for(int i=;i<n;i++)
{
c=s[i];
num[c-'a']++;
}
int ct=;
for(int i=;i<;i++)
{
if(num[i]&)
ct++;
}
if(ct>)
{
printf("impossible\n");
return;
}
for(int i=;i<;i++)
{
int kkkk=;
kkkk=;
if(num[i]&)
ans[(n>>)+]=i+'a',num[i]--;
while( (num[i]-)>= )
{
ans[now]=ans[n+-now]=i+'a';
num[i]-=;
now++;
} }
puts(ans+);
} int main()
{
//freopen("i.in","r",stdin);
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",s);
n=strlen(s);
init();
}
return ;
}

J. Good Coins

求gcd(i,j)是否为1。所以标程当然是gcd了,然而数据太水,所以用超慢超蠢的无限减法写法过了23333

 #include <cstdio>
#include <algorithm>
using namespace std;
int x,y;
int t; int make(int a,int b)
{
if(a< || b<)
return ;
if(a== || b==)
return ;
if(a<b)
return make(b,a);
if(a==b)
return ;
return make(a-b,b);
} int main()
{
//freopen("j.in","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&x,&y);
if(make(x,y))
printf("GOOD\n");
else
printf("NOT GOOD\n");
}
return ;
}

K. Clash Of Snakes

求在n*m的格子上,1*s和1*k的长条互不重叠的摆法个数。原问题是有方向的,但是没关系,我们只要在没方向的方案数上乘4就是答案了。

用容斥原理,先求出来单独摆s和摆k的个数,再求出重叠的个数,一减就是答案了。然而要注意的是,模运算中,模完再做减法可能会出负数,所以最后要特判一下(就是因为这个负数,一直wa在第二个点,呜呜呜)。

由于本人比较懒,所以写了ll类型用来求模,虽然在相同写法上速度可能会慢点,但是容易检查而且不易写错,还是值得的。最终还是只有15ms就通过啦ヾ(o◕∀◕)ノヾ

 #include <cstdio>
#include <algorithm>
using namespace std;
const int Mod=; struct ll
{
long long x;
ll() {x=;}
ll(long long tttt) {x=tttt;} ll operator + (ll b)
{
ll c;
c.x=(x+b.x)%Mod;
return c;
} ll operator * (ll b)
{
ll c;
c.x=(x*b.x)%Mod;
return c;
} ll operator -(ll b)
{
ll c;
c.x=(x-b.x)%Mod;
return c;
} }; ll get(ll n,ll m,ll k)
{
ll get_value();
if(k.x<=m.x && k.x<=n.x)
return (m-k+)*n + (n-k+)*m;
if(k.x>m.x && k.x<=n.x)
return (n-k+)*m;
if(k.x>n.x && k.x<=m.x)
return (m-k+)*n;
return get_value; } ll max(ll a,ll b)
{
if(a.x>=b.x)
return a;
else
return b;
} ll min(ll a,ll b)
{
if(a.x<=b.x)
return a;
else
return b;
} int main()
{
//freopen("k.in","r",stdin);
int t;
ll two(),four(),one(),eight();
scanf("%d",&t);
long long tmpn,tmpm,tmps,tmpk;
for(int i=;i<=t;i++)
{
scanf("%I64d%I64d%I64d%I64d",&tmpn,&tmpm,&tmps,&tmpk);
ll n(tmpn),m(tmpm),s(tmps),k(tmpk);
ll l=max(k,s);
ll r=min(k,s);
ll ans=(two*m*n-(m+n)*(k-one))*(two*m*n-(m+n)*(s-one));
ll a=min(m,k+s-one);
ll b=min(n,k+s-one);
ans=ans-k*s*( (n-s+one)*(m-k+one)+(n-k+one)*(m-s+one) );
ans=ans-(m-l+one)*n*(l-r+one)-(n-l+one)*m*(l-r+one);
ans=ans-n*(a-l)*( two*(m+one)-(a+l+one) );
ans=ans-m*(b-l)*( two*(n+one)-(b+l+one) );
ans=ans*four;
if(ans.x<)
ans.x+=Mod;
printf("Case %d: %I64d\n",i,ans.x);
}
return ;
}

2015 Syrian Private Universities Collegiate Programming Contest 题解的更多相关文章

  1. 2015 Syrian Private Universities Collegiate Programming Contest

    A. Window B. Paper Game Des:给你一个矩形集合,一开始只有一个W*H的矩形.每次可以选一个矩形,切成两个并加入集合,长和宽必须是正整数.不能操作者输,求先手赢还是输.(1 ≤ ...

  2. 2015 ACM Amman Collegiate Programming Contest 题解

    [题目链接] A - Who Is The Winner 模拟. #include <bits/stdc++.h> using namespace std; int T; int n; s ...

  3. 2017 ACM Amman Collegiate Programming Contest 题解

    [题目链接] A - Watching TV 模拟.统计一下哪个数字最多即可. #include <bits/stdc++.h> using namespace std; const in ...

  4. The 2015 China Collegiate Programming Contest Game Rooms

    Game Rooms Time Limit: 4000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  5. The 2015 China Collegiate Programming Contest A. Secrete Master Plan hdu5540

    Secrete Master Plan Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Othe ...

  6. Gym 100952E&&2015 HIAST Collegiate Programming Contest E. Arrange Teams【DFS+剪枝】

    E. Arrange Teams time limit per test:2 seconds memory limit per test:64 megabytes input:standard inp ...

  7. 2018 ACM-ICPC, Syrian Collegiate Programming Contest

    2018 ACM-ICPC, Syrian Collegiate Programming Contest A Hello SCPC 2018! 水题 B Binary Hamming 水题 C Por ...

  8. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...

  9. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...

随机推荐

  1. java自动生成略缩图

    当你要做一个图库的项目时,对图片大小.像素的控制是首先需要解决的难题. 本篇文章,在前辈的经验基础上,分别对单图生成略缩图和批量生成略缩图做个小结. 一.单图生成略缩图 单图经过重新绘制,生成新的图片 ...

  2. Jenkins+PMD构建自动化静态代码检测

    前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测 缺陷预防包括编写更好的设计规范.实施代码审核制度.运行代码静态分析工具.运行单元测试等 PMD是一种开 ...

  3. 【stanford C++】——2.C++中函数

    1. main()函数 C++程序从main()函数开始执行: int main() { /* ... code to execute ... */ } 按照约定,main函数应该返回0,除非程序遇到 ...

  4. Html中DIV成为超级链接,解决在360浏览器+IE9显示小手图标的兼容性!

    Html中DIV成为超级链接,解决在360浏览器+IE9显示小手图标的兼容性! <div style="cursor:pointer;" onclick="sele ...

  5. 交流希望希望能得到一些大神的指点,加QQ群:249627436 java技术交流群

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 本人学习java,1年多,对一些基本技巧已掌握.为了使自己能力晋升建了一个QQ群:java交 ...

  6. 偏执的我从Linux到Windows的感受

    可能很多人知道一个比我还偏执的技术狂人,也就是当年被知乎很多谈论的王垠. 他曾经写过好几篇轰动一时的文章,比如<完全用linux工作>.此文也影响了一批人拥抱Linux.不过不久之后他又写 ...

  7. npm scripts + webpack 实践经验(React、Nodejs)

    最近用Webpack+npm scripts+Mongodb+Nodejs+React写了个后台项目,在用Webpack构建过程中遇到了许多坑,就写出来分享一下. 构建工具五花八门,想当年刚学会Gru ...

  8. JS的运算问题……

    在公司实习期间,发现了一个JS很奇怪的问题. 今天在这里来探讨一下 第一个问题 在生活中或者其他语言中一般相加是这样的:0.1+0.2=0.3; 但在JS中却是这样:0.1+0.2=0.3000000 ...

  9. 在VS中配置并测试opencv

    什么是opencv? opencv是一个计算机视觉库.它目前有两个分支2.4.X和3.X,2.4.X版本是经典版本,网上的教程资源大多是关于它的,所以推荐使用2.4.X. 它能帮我做什么? 这意味着你 ...

  10. 办理卡尔加里大学(本科)学历认证『微信171922772』calgary学位证成绩单使馆认证University of calgary

    办理卡尔加里大学(本科)学历认证『微信171922772』calgary学位证成绩单使馆认证University of calgary Q.微信:171922772办理教育部国外学历学位认证海外大学毕 ...