A - Majestic 10(签到)

题目链接

#include <iostream>
using namespace std;int main()
{int t,x,y,z;scanf("%d",&t);while(t--){scanf("%d%d%d",&x,&y,&z);int num=0;if(x>=10) num++;if(y>=10) num++;if(z>=10) num++;printf("%d %d %d\n",x,y,z);if(num==0) printf("zilch\n");else if(num==1) printf("double\n");else if(num==2) printf("double-double\n");else if(num==3) printf("triple-double\n");printf("\n");}return 0;
}

B - Phoneme Palindromes(简单字符串)

题目链接


1.题目大意:回文串的判断,但多了一个条件,如果给定两个字符那么在回文串的判断里认为两个字母相同

2.第一次写map存相同的,因为题目中说一个字母不会出现在多对,但是WA了,第二次写了并查集交了过了,很奇怪

#include <iostream>
#include <cstring>
using namespace std;
int t,n,m;
int father[30];
char s[105];bool check(){int len=strlen(s)-1;for(int i=0;i<=len/2;i++){if(s[i]!=s[len-i] && father[s[i]-'a']!=father[s[len-i]-'a']) return 0;}return 1;
}int Find(int x){return father[x]==x?x:father[x]=Find(father[x]);
}void Union(int x,int y){int fx=Find(x);int fy=Find(y);if(fx!=fy){father[fy]=fx;}
}int main()
{char a,b;scanf("%d",&t);for(int kase=1;kase<=t;kase++){scanf("%d",&n);for(int i=0;i<26;i++) father[i]=i;while(n--){cin>>a>>b;Union(a-'a',b-'a');}scanf("%d",&m);printf("Test case #%d:\n",kase);while(m--){scanf("%s",s);if(check())printf("%s YES\n",s);else  printf("%s NO\n",s);}printf("\n");}return 0;
}

C - Don’t Break the Ice(简单模拟)

题目链接


1.题目大意:给出一个表格,每敲一个格子其他格子也会掉落,条件是如果一个格子所在的行和列不是完整的那么该格子会掉落。问所给操作那些是不合法的

2.使用vis数组判断格子是否掉落。如果一个格子已经被掉落直接累计,如果没有被敲过查看它所在的行和列是否完整,不完整则累计,否则设置状态为掉落

#include <iostream>
#include <cstring>
using namespace std;
int vis[105][105];
int t,n,m;bool check(int r,int c){int f1=1,f2=1;for(int i=1;i<=n;i++)if(vis[r][i]){f1=0;break;}for(int i=1;i<=n;i++)if(vis[i][c]){f2=0;break;}if(f1 || f2) return 1;return 0;
}int main()
{int x,y;ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>t;for(int kase=1;kase<=t;kase++){cin>>n>>m;memset(vis,0,sizeof vis);int sum=0;while(m--){cin>>x>>y;if(vis[x][y]) sum++;else{if(!check(x,y)) sum++;vis[x][y]=1;}}cout<<"Strategy #"<<kase<<": "<<sum<<"\n\n";}return 0;
}

D - Wildest Dreams(模拟)

题目链接


1.在一天中连续的几个时间段,每当序号为奇数的时间段就会重复播放一首歌,如果歌曲还没播完该时间段结束,那么判断在接下来的偶数时间段能否播完。然后就是偶数时间段循环播放歌曲的次数注意几个细节即可

#include <iostream>
using namespace std;
typedef long long ll;
int t,n,m,d,k;
int s[50],a[50];int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>t;for(int kase=1;kase<=t;kase++){cin>>n>>k;for(int i=1;i<=n;i++) cin>>s[i];cin>>d;cout<<"CD #"<<kase<<":\n";while(d--){cin>>m;ll ans=0;for(int i=1;i<=m;i++) cin>>a[i];for(int i=1;i<=m;i++){if(i&1){if(i==m){ans+=a[i];break;}int remain=a[i]%s[k];if(remain){ans+=(a[i]/s[k])*s[k];int w=s[k]-remain;if(a[i+1]>w){  //下个时间段可能播不完剩余的时间ans+=s[k];a[i+1]-=w;}else{ans+=a[i+1]+remain;i++;}}else ans+=a[i];}else{int now=a[i];for(int i=k+1;;i++){int cur,tag;if(i%n==0){ //因为下标从1开始这里要特判tag=n;cur=s[n];}else{tag=i%n;cur=s[i%n];}if(now<=cur){if(tag==k) ans+=now;break;}else{if(tag==k) ans+=cur;now-=cur;}}}}cout<<ans<<"\n";}cout<<"\n";}return 0;
}

E - Loopy Word Search(简单搜索)

题目链接


1.题目大意:在全是字母的棋盘上,给出一系列单词,如果能上下左右沿一个方向得到这个单词,那么输出方向和起点坐标,注意越界后可以从另一端继续匹配

2.直接模拟即可,为了方便可以将字母棋盘替换为数字棋盘

#include <iostream>
#include <cstring>
using namespace std;
int G[105][105],a[105];
char s[105];
char ans;
int t,n,m,cnt,r,c,len;bool check(int op){if(op==1){int num=1;for(int i=c-1;;i--){if(num==len) return true;if(i<1) i=m;if(a[++num]!=G[r][i]) return false;}}else if(op==2){int num=1;for(int i=c+1;;i++){if(num==len) return true;if(i>m) i=1;if(a[++num]!=G[r][i]) return false;}}else if(op==3){int num=1;for(int i=r-1;;i--){if(num==len) return true;if(i<1) i=n;if(a[++num]!=G[i][c]) return false;}}else if(op==4){int num=1;for(int i=r+1;;i++){if(num==len) return true;if(i>n) i=1;if(a[++num]!=G[i][c]) return false;}}
}void solve(){for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){if(G[i][j]==a[1]){r=i,c=j;if(check(1)){ans='L';return;}else if(check(2)){ans='R';return;}else if(check(3)){ans='U';return;}else if(check(4)){ans='D';return;}}}
}int main()
{char aa;cin>>t;for(int kase=1;kase<=t;kase++){cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>aa;G[i][j]=aa-'A';}cin>>cnt;printf("Word search puzzle #%d:\n",kase);while(cnt--){scanf("%s",s);len=strlen(s);for(int i=0,j=1;i<len;i++,j++){a[j]=s[i]-'A';}solve();printf("%c %d %d %s\n",ans,r,c,s);}printf("\n");}return 0;
}

F - Dot the i’s and Cross the T’s(计算几何)

题目链接


1.题目大意:给出一系列点,求满足一下条件线段组的个数:两线段按图示方式垂直;两线段长度相等

2.这道题还是挺遗憾的,最重要的是没看到两线段相等的条件,写了一个小时样例怎么都不对。之所以没有再读题,是因为我是暴力枚举所有线段组,虽然和下面的方法差不多,但是容易重复,搞了好久(其实不重复了,但是我不知道)没搞出样例,自闭了

3.正解确实值得学习,我这笨脑子怎么没想到:首先枚举一条线段,接着枚举所有点,如果满足点在上述线段终点的条件下,再枚举一次点找出符合条件的点的个数即可,tcl

#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
#define Seg Line
#define Vector Point
const double eps=1e-6;int dcmp(double d){if(fabs(d)<eps) return 0;return d>0?1:-1;
}struct Point{double x,y;Point(double a=0,double b=0):x(a),y(b){}Vector operator + (Vector B){return Vector(x+B.x,y+B.y);}Vector operator - (Point B){return Vector(x-B.x,y-B.y);}Vector operator * (double d){return Vector(x*d,y*d);}double operator * (Vector B){return x*B.x+y*B.y;}Vector operator / (double d){return Vector(x/d,y/d);}double operator ^ (Vector B){return x*B.y-y*B.x;}bool operator < (const Point &b) const {if(dcmp(x-b.x)==0) return y<b.y;return x<b.x;}bool operator == (const Point& b) const {if(dcmp(x-b.x)==0 && dcmp(y-b.y)==0)return true;return false;}void print(){printf("(%lf %lf)\n",x,y);}
};double dis(Vector A){return sqrt(A*A);
}double sqrDis(Vector A){return A*A;
}double angle(Vector A,Vector B){return acos(A*B/dis(A)/dis(B));
}Vector rotate(Vector A,double rad){return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));
}Vector normal(Vector A){double L=dis(A);return Vector(-A.y/L, A.x/L);
}bool ToLeftTest(Point c, Point b, Point a){return ((a-b)^(c-b)) > 0;
}struct Line{Point p,q;Vector v;Line(){}Line(Point a,Point b){p=a,q=b,v=b-a;}Point point(double t){return p+v*t;}Point spos(){return p;}Point tpos(){return q;}double length(){return dis(v);}void print(){printf("Line:(%lf,%lf)->(%lf,%lf)\n",p.x,p.y,q.x,q.y);}
};double disToLine(Point p,Line l){     //点到直线距离Vector v=p-l.p;return fabs(l.v^v) / dis(l.v);
}double disToSeg(Point p,Seg l){        //点到线段距离if(l.p==l.q) return dis(p-l.p);Vector v1=p-l.p,v2=p-l.q;if(dcmp(v1*l.v)<0) return dis(v1);if(dcmp(v2*l.v)>0) return dis(v2);return disToLine(p,l);
}Point getPro(Point p,Line l){      //点在直线投影return l.p+l.v*(l.v*(p-l.p)/dis(l.v));
}bool isOnLine(Point p,Line l){       //点是否在直线上return dcmp((l.p-p)^(l.q-p))==0?true:false;
}bool isOnSeg(Point p,Seg l){       //点是否在线段上return dcmp((l.p-p)^(l.q-p))==0 && dcmp((l.p-p)*(l.q-p))<=0;
}bool isLineInter(Line a,Line b){       //两直线是否相交return dcmp(a.v^b.v)==0?false:true;
}Point getLineInter(Line a,Line b){     //返回两直线交点Vector u = a.p-b.p;double t = (b.v^u) / (a.v^b.v);return a.point(t);    //或者a.p+a.v*t;
}bool isSegInter(Seg a,Seg b){          //线段是否相交double c1=a.v^b.p-a.p,c2=a.v^b.q-a.p;double c3=b.v^a.p-b.p,c4=b.v^a.q-b.p;//判断两线段端点是否在另外一条线段上if(!dcmp(c1) || !dcmp(c2) || !dcmp(c3) || !dcmp(c4)){bool f1=isOnSeg(b.p,a);bool f2=isOnSeg(b.q,a);bool f3=isOnSeg(a.p,b);bool f4=isOnSeg(a.q,b);bool f=(f1|f2|f3|f4);return f;}return (dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0);
}bool isLineSegInter(Line a,Seg s){     //判断直线和线段是否相交double c1=a.v^s.p-a.p,c2=a.v^s.q-a.p;return dcmp(c1)*dcmp(c2)<=0;
}Point p[105];int main()
{int t,n;double x,y;cin>>t;for(int kase=1;kase<=t;kase++){cin>>n;for(int i=1;i<=n;i++){cin>>p[i].x>>p[i].y;}int ans=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){Line L1=Line(p[i],p[j]);Point mid=(p[i]+p[j])/2;for(int k=1;k<=n;k++){if(p[k]==mid){for(int h=1;h<=n;h++){if(h==k) continue;Line L2=Line(p[k],p[h]);if(dcmp(L1.v*L2.v)==0 && dcmp(L1.length()-L2.length())==0) ans++;}break;}}}}printf("Set #%d: %d\n\n",kase,ans);}return 0;
}

F - Dot the i’s and Cross the T’s(枚举技巧)

题目链接


1.题目大意:给出一个整除数对的定义,和平常的整除关系相似,两处不同:一是两个数不能相等,二是0的时候,题目中有详细阐述。求最多1e^6个数的数对个数

2.这道题也很遗憾,假设有5e^5个0 和 5e^5个任意数,那么答案的一部分会是25e^10,因此不止答案要long long中间变量也要用long long。然后前面加个1LL乘就行了

3.首先暴力肯定超时,那么由于数字最大1e^7,可以开这么大的数组的,我们就保存每个数的个数,然后离散化数组。对于每个满足数对,那么答案为两个数的数量乘积,但是注意0的时候要特判。尽管这样优化,但是有可能每个数都不一样,还是超时。然后就借助于素数筛选那里的思想,首先记录出现的每个数,而且记录最大值,接着对于任何一个数,一个for循环,每次加上这个数本身,判断该数在最大值范围内的所有倍数是否出现即可

#include <iostream>
#include <math.h>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
const int N=1e6+10;
int n,t;
bool vis[maxn];
int a[N],b[maxn];int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>t;//Prime();for(int kase=1;kase<=t;kase++){cin>>n;memset(b,0,sizeof b);memset(vis,0,sizeof vis);int Max=-1;for(int i=1;i<=n;i++){cin>>a[i];b[a[i]]++;vis[a[i]]=1;Max=max(Max,a[i]);}sort(a+1,a+1+n);int m=unique(a+1,a+1+n)-a-1;ll ans=0;for(int i=1;i<=m;i++){if(a[i]==0){ans+=1LL*(n-b[0])*b[0];continue;}else if(a[i]==1){ //纯属想节省一下时间,不特判也行ans+=1LL*(n-b[1]-b[0])*b[1];continue;}int cnt=0;for(int j=a[i]*2;j<=Max;j+=a[i]){if(vis[j]) cnt+=b[j];}ans+=1LL*cnt*b[a[i]];}cout<<"Test case #"<<kase<<": "<<ans<<"\n\n";}return 0;
}

UCF Local Programming Contest 2016 计蒜客解(补)题报告相关推荐

  1. CTU Open Contest 2019 计蒜客重现补题报告

    个人总结 寒假过完的第一场比赛,总是有很多问题.主要有以下两点:一是寒假做题有点依赖翻译,看不下去很长的英文题面,导致这次比赛的一些题目看很长时间也没看懂.二是发现了自己的做题量仍然很少,很多题目缺乏 ...

  2. UCF Local Programming Contest Round 1A记录

    A. Briefcases Full of Money 题目描述 输入描述: 输出描述: 示例1 输入 84 111 2 3 2 3 输出 5 示例2 输入 200 3 20 5 4 1 输出 50 ...

  3. 【画画】UCF Local Programming Contest 2012(Practice)E. Pete's Pantry

    题目链接https://www.jisuanke.com/contest/7332 纯粹的画画题(可光题意就理解了一年) 此生再也不愿意做这种题(流泪) #include<bits/stdc++ ...

  4. UCF Local Programming Contest 2012(Practice)E. Pete's Pantry 【模拟】

    题意: n个罐子,每个罐子印了几行字,一行以#为界,最长的的一行记为w,每个罐子是高为6,宽为w的矩形+外面一圈#.按输入顺序将罐子叠放起来,规则为:罐子A(宽度w)只能放在宽度比它大的其他罐子上.从 ...

  5. ICPC North Central NA Contest 2017 计蒜客重现 解(补)题报告

    前言 不知不觉又到了周六训练赛,时间过得真快.手机前段时间被我不小心摔坏了,没手机玩的第十天, 无奈只能学习了 ,想它.题目还是要做的,题解还是要写的,CF还是得抽时间打的,所以说手机坏了貌似是好事. ...

  6. 计蒜客python刷题笔记

    1.计算A+B A,B= map(int, input().split()) C=int(A+B) print(C) 这里面输入必须同时输入两个数.用空格隔开,所以用到了map函数,第一个参数控制格式 ...

  7. 计蒜客--第31题:无脑博士的试管们

    第31题:无脑博士的试管们 时间限制 1000 ms 内存限制 10000 K 无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装 ...

  8. 计蒜客网站 ACM-ICPC亚洲区赛题

    The Preliminary Contest for ICPC China Nanchang National Invitational(2019) ACM-ICPC Jiaozuo Onsite ...

  9. 【水一波题解】题解 of University of Central Florida 2020 (Fall) “Practice” Local Programming Contest

    题解 of University of Central Florida 2020 (Fall) "Practice" Local Programming Contest [by_0 ...

最新文章

  1. React组件继承的由来
  2. File,FileInfo;Directory,DirectoyInfo的区别
  3. 【Android】Android中WIFI开发总结(一)
  4. 大厂中秋礼盒大PK!祝大家中秋快乐,送大家鹅厂月饼礼盒!
  5. 【STC15库函数上手笔记】5、定时器
  6. 包教包会,7段代码带你玩转Python条件语句
  7. ❤️万字总结八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序❤️
  8. 草莓甜品海报设计,甜出画面,受得住诱惑么?
  9. C语言__builtin_choose_expr实现函数重载
  10. P102、面试题14:调整数组顺序使奇数位于偶数前面
  11. java怎么让main方法不退出_JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?...
  12. Qt学习之路_008-最全的Qt学习总结(前期)
  13. SVN创建分支/合并分支/切换分支
  14. MS08067利用方法
  15. diy计算机组装注意事项,DIY电脑组装教程:diy装机之三大原则八项注意
  16. 输入法兼容 android,搜狗输入法5.1版发布 兼容Android 4.4
  17. 少子寿命测试仪 硅片少子寿命测试系统美国Sinton WCT-120少子寿命测试仪
  18. 转:微信、米聊用户数量猛增 短信业务受冲击
  19. 【BI学习笔记】在Linux上安装Wyn Enterprise商业智能报表服务器
  20. 新合同解决风波,阅文与作者以后要怎么走?

热门文章

  1. 当兵的目标和计划_新兵下连时,一定要弄明白这三件事,对新兵及家长来说很有必要...
  2. IOS UIView 01-View开始深入 绘制像素到屏幕上
  3. 光纤测温技术简介及其应用
  4. linux学习笔记 linux内核6.0.2目录结构
  5. Android权限(permission)大全
  6. SAN存储和服务器虚拟化安装方案,基于SAN存储架构的x86服务器虚拟化测试方案.pdf...
  7. java同步锁售票_线程同步锁之火车站售票案例
  8. Windows批处理文件中相当于NEQ、LSS、GTR等的符号
  9. 寒假的牛客训练赛1补题
  10. 一秒看懂:SaaS软件和传统软件的区别!