cf_292 Div.2
来源:互联网 发布:dnf打团网络冲突 编辑:程序博客网 时间:2024/06/09 16:51
源地址:http://codeforces.com/contest/515
A:输入三个数a,b,n.问能否用n步从(0,0)点走到(a,b)点,移动方向为上下左右。
很明显,先求出到a,b至少移动几步,如果用n步都不能到达(a,b),那么显然不能。。如果n大于等于走到(a,b)的最小步数且(n-最小步数)为偶数时(即可以反复在用一个地方走动)时能够到达。
#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 100010ll Abs(ll x){ return x>0?x:-x;}int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);#endif ll a,b,s; while(scanf("%I64d%I64d%I64d",&a,&b,&s)!=EOF){ ll dif = Abs(a)+Abs(b); s -= dif; if(s>=0 && (s%2==0)){ printf("Yes\n"); }else printf("No\n"); }return 0;}B:题意就是有n个男孩和m个女孩,n个男孩中状态好的被标志为1,状态不好的为0,女孩亦如此。从头开始,每一天选择一对男女孩,即在i<min(n,m)时这对男女孩为第i个男孩和第i个女孩配对,如果其中有一个状态好的,那么两个人状态都会变好,即都会变为1。当i>min(n,m)时,那么选择完的那一方将会从头重新开始按顺序选择,即(i+1)%n和(i+1)%m进行配对。问最后能否使得所有人的状态都变好。
模拟题,我们发现每当配对至lcm(n,m)次时,那么男孩和女孩的配对方式会和刚开始的一样,等于循环了一遍。所以我们只要进行lcm(n,m)次配对就可以了,再对每个人状态检查一遍即可。刚开始我没细想,直接将每次配对都循环1000010次,这样得出结果也是一样的,因为n,m都比较小。
#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 110#define M 1000010int by[N];int gr[N];int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);#endif while(sfd(n,m)!=EOF){ MEM1(by); MEM1(gr); int x,y,tmp; sf(x); for(int i=0;i<x;i++){ sf(tmp); by[tmp] = 1; } sf(y); for(int i=0;i<y;i++){ sf(tmp); gr[tmp] = 1; } int p1=0,p2=0; int ct=0; while(ct<M){ by[p1] = gr[p2] = (by[p1]|gr[p2]); p1 = (p1+1)%n; p2 = (p2+1)%m; ct++; } int flag=1; for(int i=0;i<n;i++) if(!by[i]) flag=0; for(int i=0;i<m;i++) if(!gr[i]) flag=0; if(flag) printf("Yes\n"); else printf("No\n"); }return 0;}C:给你一个x,求找到一个不含0,1数字的a,使得函数F(x)=F(a)
F(1234)=1!*2!*3!*4!
这道题目我的方法比较笨,就是把数字拿来分解,对于x中的每一个数字,如果它是素数,那么就把它写到a中的某一位,如果是合数,那么就把它进行分解,分解为多个素数的乘积,最后输出。
但是其实一共就10个数字,我们把每个数字的分解形式找出来就行,比如F(1234)=F(33222),我们可以看出,这里的4!被分解为3!2!2!,同理9!可以被分为7!2!3!3!
#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 110#define M 1000010char ch[20];int ct[15];int prm[20];int res[110];int k;void Init(){ k=0; prm[k++] = 2; prm[k++] = 3; prm[k++] = 5; prm[k++] = 7;}bool check(int x){ if(x==2||x==3||x==5||x==7) return true; return false;}int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);#endif ll x; Init(); while(sf(n)!=EOF){ sfI(x); sprintf(ch,"%I64d",x); int len = strlen(ch); memset(ct,0,sizeof ct); for(int i=0;i<len;i++){ for(int j=ch[i]-'0';j>=2;j--){ ct[j]++; } } int p=0; for(int i=9;i>1;i--){ if(ct[i]&&check(i)){ for(int j=0;j<ct[i];j++){ res[p++] = i; for(int s=i-1;s>1;s--) ct[s]--; } } else if(ct[i]&&!check(i)){ int tmp=i; for(int j=0;j<k;j++){ if(tmp%prm[j]==0){ while(tmp%prm[j]==0){ tmp /= prm[j]; ct[prm[j]] += ct[i]; } } } } } for(int i=0;i<p;i++) printf("%d",res[i]); printf("\n"); }return 0;}
简单解法:
string a[10] = {"", "", "2", "3", "223", "5", "35", "7", "2227", "7233"};<span style="white-space:pre"></span>//0-10的分解方法int main(){ int n; string s, ans; cin >> n >> s; for(int i = 0; i < n; ++i) ans += a[s[i]-'0']; sort(ans.begin(), ans.end()); reverse(ans.begin(), ans.end()); cout << ans << endl; return 0;}D:题意就是给你一个n*m的地图,有‘.’和‘*’两种图案,其中'.'的地方是可以放东西的,题目给的是1*2大小的东西,问是否存在且只有一种方法使得1*2的东西能够刚好把这地图填满(即没有'.')。
刚开始用了dfs,,直接超时了。。--
后来参考了下别人,用的是bfs,其实思路相当清晰。
对于一个只有一种方法的地图来说,肯定有个地方是只能放<>或者^v的,要不然如果所有地方都能够放置两种方法,那总的肯定也不至一种。
当我们每找到一个这种只能放一种图案的空地时(我们姑且称它为符合条件的空地),我们就将它入队,然后当每个这种空地出队时,我们把它和它旁边仅有的那块空地组成一个唯一的图案,再在那块“旁边的空地”上向四周找寻符合条件的空地(因为它四周的空地因为少了它以后,就很有可能会成为一块符合条件的空地),如果有符合条件的,就入队,直到队列为空。
最后我们在地图中寻找是否还残留有'.'的地方,如果有,那么说明该地图不能被1*2的东西填满。反之则反。
#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<iterator>#include<math.h>#include<stdlib.h>#include<limits.h>#include<map>//#define ONLINE_JUDGE#define eps 1e-8#define INF 0x7fffffff#define FOR(i,a) for((i)=0;i<(a);(i)++)#define MEM(a) (memset((a),0,sizeof(a)))#define sfs(a) scanf("%s",a)#define sf(a) scanf("%d",&a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define pfs(a) printf("%s\n",a)#define sfd(a,b) scanf("%d%d",&a,&b)#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)#define for1(i,a,b) for(int i=(a);i<b;i++)#define for2(i,a,b) for(int i=(a);i<=b;i++)#define for3(i,a,b)for(int i=(b);i>=a;i--)#define MEM1(a) memset(a,0,sizeof(a))#define MEM2(a) memset(a,-1,sizeof(a))#define Pr(x,y) make_pair(x,y)const double PI=acos(-1.0);template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}template<class T> inline T Min(T a,T b){return a<b?a:b;}template<class T> inline T Max(T a,T b){return a>b?a:b;}using namespace std;#define ll __int64int n,m;#define Mod 10#define N 110#define M 100010char ch[2010][2010];char tmp[2010][2010];char s[5] = "<^>v";<span style="white-space:pre"></span>//这个的顺序要和dirx和diry的相对应int dirx[4] = {0,1,0,-1};int diry[4] = {1,0,-1,0};bool check(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m&&ch[x][y] == '.') return true; return false;}int getNum(int x,int y){<span style="white-space:pre"></span>//判断x,y是否为符合条件的空地 int res=0; for(int i=0;i<4;i++){ int nx = x+dirx[i]; int ny = y+diry[i]; if(check(nx,ny)) res++; } return res;}queue<pair<int,int> >q;int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);#endif while(sfd(n,m)!=EOF){ for(int i=0;i<n;i++) sfs(ch[i]); while(!q.empty()) q.pop(); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(check(i,j)&&getNum(i,j)==1) q.push(Pr(i,j)); } } while(!q.empty()){ int tmpx = q.front().first; int tmpy = q.front().second; q.pop(); for(int i=0;i<4;i++){ int nx = tmpx+dirx[i]; int ny = tmpy+diry[i]; if(check(nx,ny)){ ch[tmpx][tmpy] = s[i]; ch[nx][ny] = s[i^2]; //0&2 2&0 1&3 3&1 for(int j=0;j<4;j++){ int nxx = nx+dirx[j]; int nyy = ny+diry[j]; if(check(nxx,nyy)&&getNum(nxx,nyy)==1){ q.push(Pr(nxx,nyy)); } } } } } int flag = 1; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if(ch[i][j] == '.') flag = 0; } if(!flag) printf("Not unique\n"); else{ for(int i=0;i<n;i++) printf("%s\n",ch[i]); } }return 0;}
- cf_292 Div.2
- div-2
- 体验DIV+CSS(2):DIV + CSS 进阶
- Codeforces Round #167 (Div. 2 && Div.1)
- Codeforces Round #185 (Div. 1) && (Div. 2)
- Codeforces Round #166 (Div. 1) && (Div. 2)
- Codeforces Round #292 (Div. 2 Div. 1)
- Codeforces Round #413(Div. 1 + Div. 2)
- div+css (2)
- SRM 458 Div 2
- SRM 459 DIV 2
- SRM 480 DIV 2
- 初学CSS+DIV(2)
- DIV+CSS案例2
- div 拖动2
- div 拖动3(2)
- div+css(2)选择器
- SRM 527 DIV 2
- 一些私活信息
- 【入门】绝对值排序 【排序】
- 如何确认某日是否为工作日(休息日)
- 一般异常和运行时异常
- 搜索推广营销五步曲第二步:推广分析
- cf_292 Div.2
- 生产者消费者问题(PV操作)
- 设计模式学习笔记---适配器模式adapter(Java版)
- 黑马程序员--05Ctypedef/extern/static
- HDU 1057 模拟细菌的变化
- 如何打造一个伟大的产品2 - 三个木桶模型
- iOS 消息推送原理及实现总结
- [2015.3.2] 新起点
- typedef void (*sighandler_t)(int);类型说明