博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #297 (Div. 2)
阅读量:4705 次
发布时间:2019-06-10

本文共 5642 字,大约阅读时间需要 18 分钟。

这套题没有算法性特别强的题,主要强调理清题意后的分析观察题目特性的能力,用到的都是常用的技巧。最后两道比较考代码能力。

A. Vitaliy and Pie

扫一遍字符串,拿到的钥匙记上,遇到开不了的门就ans++.

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define pii pair
#define LL long long intconst double eps=1e-10;const int INF=1000000000;const int maxn=100000+10;int n,ans=0;string s;int a[26];int main(){ //freopen("in2.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&n); cin>>s; int len =s.length(); memset(a,0,sizeof(a)); for(int i=0;i
='a'&&s[i]<='z') { a[s[i]-'a']++; } else { char c=s[i]-'A'+'a'; if(a[c-'a']==0) { ans++; } else { a[c-'a']--; } } } cout<
<
A

B. Pasha and String

根据m<=105,如果每次都真的交换一下,那么必然超时。那么需要分析问题找特性了,首先这种交换问题很显然的特点就是最终交换次数为偶数等于没换,交换次数为奇数等于换了一次。那么只要用一个数组a[i]统计一下每个s[i]的最终交换次数,最后扫一遍数组,奇数的换就行了。记录s[i]的交换次数又有技巧,如果m次中每次都把a[t]到a[|s|-t+1]都加1,那么这又会超时,所以采用线性数组区间加减常用的延迟技巧,可以把时间降到线性。也就是每次只是a[t]++,最后扫一遍把所有a[i]都变了就好了。由于题目特点,只需要算一半。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define pii pair
#define LL long long intconst double eps=1e-10;const int INF=1000000000;const int maxn=100000+10;char s[2*maxn];int m,a[maxn];int main(){ //freopen("in2.txt","r",stdin); scanf("%s",s); scanf("%d",&m); int t,len=strlen(s); for(int i=0; i
B

C. Ilya and Sticks

贪心,能用大的就用大的呗。之前先处理一下,把奇数个的减一,后面有比它小1的就加到后边。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define pii pair
#define LL long long intconst double eps=1e-10;const int INF=1000000000;const int maxn=100000+10;int n,l,maxl=-1;LL ans=0;int cnt[10*maxn];int main(){ //freopen("in2.txt","r",stdin); scanf("%d",&n); for(int i=0; i
=1; i--) { if(cnt[i]&1) { if(cnt[i-1]>0) { cnt[i-1]++; cnt[i]--; } else cnt[i]--; } } for(int i=maxl; i>=1; i--) { while(cnt[i]>=4) { ans+=(LL)i*i; cnt[i]-=4; } if(cnt[i]==2) { for(int j=i-1; j>=1; j--) { if(cnt[j]>=2) { ans+=(LL)i*j; //cnt[i]-=2; cnt[j]-=2; i=j+1; break; } } } } cout<
<
C

D. Arthur and Walls

观察,分析题目特点很重要。这道题的特性就是在每个2*2的子单元里出现四个点一个星,那么这个星必删,其它情况的星都可以不删。相关题目做多了的大牛其实会很快找到这种规律。还要注意有可能当前删一个星后影响到前面本来不用删的星变成了必删的星了,所以每删一次dfs检查一下。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define pii pair
#define LL long long intconst double eps=1e-10;const int INF=1000000000;const int maxn=2000+10;int n,m;char s[maxn][maxn];int dx[8]= { 0,0,1,-1,1,-1,-1,1};int dy[8]= { 1,-1,1,-1,0,0,1,-1};bool ok(int x,int y){ return (x>=1&&x<=n)&&(y>=1&&y<=m);}bool gao(int x,int y){ if(ok(x,y+1)&&ok(x+1,y)&&ok(x+1,y+1)) { if(s[x][y+1]=='.'&&s[x+1][y]=='.'&&s[x+1][y+1]=='.') return true; } if(ok(x-1,y+1)&&ok(x-1,y)&&ok(x,y+1)) { if(s[x-1][y+1]=='.'&&s[x-1][y]=='.'&&s[x][y+1]=='.') return true; } if(ok(x-1,y-1)&&ok(x-1,y)&&ok(x,y-1)) { if(s[x-1][y-1]=='.'&&s[x-1][y]=='.'&&s[x][y-1]=='.') return true; } if(ok(x+1,y-1)&&ok(x,y-1)&&ok(x+1,y)) { if(s[x+1][y-1]=='.'&&s[x][y-1]=='.'&&s[x+1][y]=='.') return true; } return false;}void dfs(int x,int y){ if(s[x][y]=='.') return; if(gao(x,y)) { s[x][y]='.'; for(int i=0; i<8; i++) { int tx=x+dx[i]; int ty=y+dy[i]; if(ok(tx,ty)) { if(s[tx][ty]=='*') { dfs(tx,ty); } } } return ; } else return ;}int main(){ //freopen("in2.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%s",s[i]+1); } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(s[i][j]=='*') { dfs(i,j); } } } for(int i=1; i<=n; i++) puts(s[i]+1); //fclose(stdin); //fclose(stdout); return 0;}
D

E. Anya and Cubes

中途相遇法的典型应用。直接枚举是325的复杂度会超时,那么分两头枚举呗,每头312这样就不超时了。但是具体实现需要一定的代码功力。这里引用网上某大神的代码,比我写的好。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;typedef unsigned long long ULL;map
q1[30], q2[30];LL a[30] = { 0}, gc[30] = { 0};int n, k;LL s;int dfs(int wh, int end_, int t, int one, LL sum){ if(t > k || sum > s) return 0; if(wh == end_+1) { if(one == 1) q1[t][sum]++; else for(int i = t; i <= k; i++) q2[i][sum]++;// return 0; } dfs(wh+1, end_, t, one, sum+a[wh]); if(a[wh] < 19) dfs(wh+1, end_, t+1, one, sum+gc[a[wh]]); dfs(wh+1, end_, t, one, sum);}int main (){ gc[0] = 1; gc[1] = 1; for(int i = 2; i <= 19; i++) gc[i] = gc[i-1]*i; cin >> n >> k >> s; int mid = n/2; for(int i = 1; i <= n; i++) cin >> a[i]; dfs(1, mid, 0, 1, 0); dfs(mid+1, n, 0, 2, 0); map
:: iterator it; LL ans = 0; for(int i = 0; i <= k; i++) { for(it = q1[i].begin(); it != q1[i].end(); it++) { if(q2[k-i].find(s - (it->first)) != q2[k-i].end()) ans += (LL)(it->second)*q2[k-i][s- (it->first)]; } } cout << ans << endl; return 0;}
E

转载于:https://www.cnblogs.com/zywscq/p/4394189.html

你可能感兴趣的文章
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>
配置NRPE的通讯
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>
让数据库跑的更快的7个MySQL优化建议
查看>>
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
PAT(B) 1014 福尔摩斯的约会(Java)
查看>>
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>
python 二维字典
查看>>
Arrays类学习笔记
查看>>
实验吧之【天下武功唯快不破】
查看>>