Educational Codeforces Round 1 Tutorial
来源:互联网 发布:js拖拽事件canvas 编辑:程序博客网 时间:2024/06/07 16:42
题目传送门:http://codeforces.com/contest/598
A. Tricky Sum
题意:问小于等于n的所有自然数与其系数乘积的和,其中所有2的次幂(包括0次幂)的系数为-1,其他数字系数为1。
解法:直接根据公式求出自然数前n项和,然后枚举2的幂减去两倍即可。
#include <bits/stdc++.h>using namespace std;long long tt[33];int main(){ tt[0]=1; for(int i=1;i<=32;i++) tt[i]=tt[i-1]*2; int t; scanf("%d",&t); for(int i=1;i<=t;i++){ long long x; scanf("%I64d",&x); int it=upper_bound(tt,tt+33,x)-tt; x=x*(x+1)/2; for(int i=0;i<it;i++) x-=2*tt[i]; printf("%I64d\n",x); } return 0;}B. Queries on a String
题意:给你一个字符串,有若干旋转操作,(l,r,k)表示把原字符串中位于[l,r]中的字符向右移动k位。问最后这个字符串是什么。
解法:根据<algorithm>头文件中的rotate函数直接模拟就行,不过这个函数是向右移动,稍微变形一下即可。
#include <bits/stdc++.h>using namespace std;char s[10005];int main(){ ios::sync_with_stdio(false); cin>>s; int m; cin>>m; while(m--){ int l,r,k; cin>>l>>r>>k; k%=(r-l+1); rotate(s+l-1,s+r-k,s+r); } cout<<s<<endl; return 0;}
C. Nearest vectors
题意:在坐标系中给你很多以原点作为端点的向量,问相互之间形成角度最小的两个向量的编号。
解法:按照与x轴正方向形成的角度排序,比较相邻的两个向量更新答案。
#include <bits/stdc++.h>using namespace std;vector<pair<long double,int> >ang;const double PI = acos(-1.0);int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++){ long double x,y; cin>>x>>y; ang.push_back(make_pair(atan2(y,x),i)); } sort(ang.begin(),ang.end()); long double tg=1e9; int ans=-1; for(int i=1;i<ang.size();i++) if(ang[i].first-ang[i-1].first<tg){ tg=ang[i].first-ang[i-1].first; ans=i; } if(PI*2-ang[ang.size()-1].first+ang[0].first<tg) ans=0; printf("%d %d\n",ang[ans].second,(ans==0?ang[ang.size()-1].second:ang[ans-1].second)); return 0;}
D. Igor In the Museum
题意:输入一个矩阵,问从某一位置开始并可以任意移动到空位置能看到的画有多少幅。不同位置看到的相同的画算多个答案。
解法:dfs预处理出所有空位置的答案即可。
#include <bits/stdc++.h>using namespace std;const int N = 1005;char g[N][N];bool vis[N][N];int n,m,k,dx[]={1,0,-1,0},dy[]={0,1,0,-1},ans[N][N];void dfs1(int x,int y,int& t){ for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(g[xx][yy]=='*') t++; else if(!vis[xx][yy]&&g[xx][yy]=='.'){ vis[xx][yy]=true; dfs1(xx,yy,t); } }}void dfs2(int x,int y,int t){ ans[x][y]=t; for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(g[xx][yy]=='.'&&ans[xx][yy]!=t) dfs2(xx,yy,t); }}int main(){ scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=n;i++) scanf(" %s",g[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!vis[i][j]&&g[i][j]=='.'){ vis[i][j]=true; int ans=0; dfs1(i,j,ans); dfs2(i,j,ans); } while(k--){ int x,y; scanf("%d %d",&x,&y); printf("%d\n",ans[x][y]); } return 0;}
E. Chocolate Bar
题意:给你一块n*m的巧克力,定义沿着某一条长度为L的线段掰开巧克力的花费是L*L,问要吃到k个单位大小的巧克力的最小花费是多少。
解法:注意到n,m,k都很小,直接记忆化搜索即可。
#include <bits/stdc++.h>using namespace std;const int N = 35;int dp[N][N][N+20];int dfs(int x,int y,int nd){ if(nd==0||x*y==nd) return 0; if(dp[x][y][nd]!=-1) return dp[x][y][nd]; int res=0x3f3f3f3f; for(int i=1;i<x;i++) for(int j=0;j<=nd;j++) if(i*y>=j&&(x-i)*y>=nd-j) res=min(res,y*y+dfs(i,y,j)+dfs(x-i,y,nd-j)); for(int i=1;i<y;i++) for(int j=0;j<=nd;j++) if(x*i>=j&&x*(y-i)>=nd-j) res=min(res,x*x+dfs(x,i,j)+dfs(x,y-i,nd-j)); return res;}void init(){ memset(dp,-1,sizeof dp); for(int i=1;i<=30;i++) for(int j=1;j<=30;j++) for(int k=1;k<=min(i*j,50);k++) dp[i][j][k]=dfs(i,j,k);}int main(){ init(); int t,n,m,k; scanf("%d",&t); while(t--){ scanf("%d %d %d",&n,&m,&k); printf("%d\n",dp[n][m][k]); } return 0;}
F. Cut Length
题意:输入若干个点,问给定线段和这些点构成的多边形相交的长度为多少。
解法:参考http://blog.csdn.net/lwt36/article/details/50545565
阅读全文
0 0
- Educational Codeforces Round 1 Tutorial
- Educational Codeforces Round 1
- 【CODEFORCES】 Educational Codeforces Round 1
- Educational Codeforces Round 1 A. Tricky Sum
- Educational Codeforces Round 1 (A)模拟
- Educational Codeforces Round 1(B)
- Educational Codeforces Round 1 A. Tricky Sum
- Educational Codeforces Round 1 C. Nearest vectors
- Codeforces Educational Round 1 C题
- Educational Codeforces Round 1 C. Nearest vectors
- Educational Codeforces Round 1 C - Nearest vectors
- Educational Codeforces Round 1C. Nearest vectors
- Educational Codeforces Round 2
- Educational Codeforces Round 2
- Educational Codeforces Round 2
- Educational Codeforces Round 3
- Codeforces Educational Round 3
- Codeforces Educational Round 5
- 根据连接参数获取ArcSde空间库
- mv命令
- TCP-IP 概述
- 工厂方法模式(factory method)c++版本
- 《辛雷学习方法》读书笔记——前言
- Educational Codeforces Round 1 Tutorial
- DIR dirp对目录的操作
- HibernateException: Found shared references to a collection 解决办法
- 常用学习资源的网址汇总
- JS闭包可被利用的常见场景
- uboot笔记:uboot命令分析+实现
- 编译NVCaffe0.16出错-不支持gcc4.8.3-已安装4.8.5
- 内容提供者(ContentProvider)和内容观察者(ContentObserver)的使用(以应用锁为例)
- vue v-bind:class中属性使用引号