Codeforces Round #401 (Div. 2)

很happy,现场榜很happy,完全将昨晚的不悦忘了。终判我校一片惨白,小董同学怒怼D\E,离AK就差一个C了,于是我AC了C题还剩35分钟立刻开D题,不料英文苦涩难懂,懂了题意之后发现也是个水题,从后往前遍历一遍即可。然而代码速度和思维都不算很好,还有半分钟在徘徊要不要测一下样例,但又怕OJ卡了,直接交第一组就跪了,然后发现个小问题改改又直接交最后5秒然而以第一组WA结束本场CF。

A  Shell Game

题意:有三个位置分别为0 1 2。有一个球在这三个位置转换,当第i次变换如果i为奇数则0和1位置交换,反之1和2交换,给出次数n和求的最终位置k。求初始位置。

这个题没什么规律可言,可怜我们推了这么久,最后无奈手推所有情况发现6为周期,然后直接暴力判断所有情况。

int main()
{
int n,x;
while(~scanf("%d%d",&n,&x))
{
n%=6;
if(n==0) printf("%d\n",x);
if(n==1)
{
if(x<2) printf("%d\n",abs(x-1));
else puts("2");
}
if(n==2) {
if(x==0) puts("1");
if(x==1) puts("2");
if(x==2) puts("0");
}
if(n==3){
if(x==0) puts("2");
if(x==1) puts("1");
if(x==2) puts("0");
}
if(n==4) {
if(x==0) puts("2");
if(x==1) puts("0");
if(x==2) puts("1");
}
if(n==5) {
if(x==0) puts("0");
if(x==1) puts("2");
if(x==2) puts("1");
} }
return 0;
}

B. Game of Credit Cards

题意:A和B玩游戏,他们分别在纸上写下n个数字(0-9)。然后对比,如果A[i]>B[i] ,A打B一下,如果A比B小则B打A一下,现在B可以作弊,他知道了A的n个数。问你B最少被打几下,A最多被打几下。

思路:就是一个简单贪心貌似,终判挂了好多人。直接将所有的数字出现的次数用数组存起来,然后求B最少被打几下,我们肯定是抵消原则,从最接近A的那个数往上开始查找然后抵消一个B的数字。我们可以假设B被打n次,然后我们肯定是尽量抵消。求A最多被打几次也是从A那个数字往上但不能等于A[i],因为要比A大且最接近A[i]才是最优策略,如果找不到比这个数大的那只能被打了。我们就找一个最小的和这个抵消.

char s1[N],s2[N];
int a1[10],a2[10],a3[10];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a1,0,sizeof(a1));
memset(a2,0,sizeof(a2));
memset(a3,0,sizeof(a3));
scanf("%s%s",s1,s2);
for(int i=0; i<n; i++)
{
a1[s1[i]-'0']++;
a2[s2[i]-'0']++;
a3[s2[i]-'0']++;
}
int mi=0,ma=0;
for(int i=0; i<n; i++)
{
int id=s1[i]-'0';
int f=1;
for(int j=id; j<=9; j++)
if(a2[j])
{
a2[j]--;
f=0;
break;
}
if(f) mi++;
} for(int i=0; i<n; i++)
{
int id=s1[i]-'0';
int f=0;
for(int j=id+1; j<=9; j++)
if(a3[j])
{
a3[j]--;
f=1;
break;
}
if(f) ma++;
else
{
for(int j=0; j<=id; j++)
if(a3[j])
{
a3[j]--;
break;
}
}
}
printf("%d\n%d\n",mi,ma);
}
return 0;
}

C. Alyona and Spreadsheet

这题仔细思考其实也很简单,开始没有明确给出n和m的范围让我很是迷茫,不过就是没有给出所以促使我去寻找优化的方案,那就是滚动数组。

题意:n行m列的格子,每个格子里都有一个数,如果有一列的元素都非递减,那么就称这列为非递减列。现在给你l和r求l行到r行之间的这m列是否存在非递减列。

思路:如果只有一列我们就相当于求连续非递减子序列最大长度,但有m列我们可以就用一个数组b来分别表示这m列的最长非递减子序列长度,注意b[i]表示第i列的当前最长,如果不满足非递减了直接将b[i]赋为1,每一行中都找一个最大b[i]然后用数组v存起来,v[i]就表示到第i行为止最长的。因为题目描述的是存在,所以我们只要求出最长的然后存起来就行了,如果l到r之间有某一列非递减,那么v[r]肯定大于等于这个区间长度。那么不好开数组怎么判断当前行与上一行的大小情况呢,注意我们只判断当前行与上一行,所以第一维设为2即可,然后判断完毕将当前行复制给上一行即可。

int a[2][N],b[2][N],v[N];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(b,0,sizeof(b));
for(int i=1; i<=m; i++) b[1][i]=1;//b数组开一维的就行了
v[1]=1;//存到当前行的最长的递增:
for(int i=1; i<=n; i++)
{
int ma=1;
for(int j=1; j<=m; j++)
{
scanf("%d",&a[1][j]);
if(i>1)
{
if(a[1][j]<a[0][j]) b[1][j]=1;
else b[1][j]++;
ma=max(ma,b[1][j]);//找到到当前行最长的
}
}
for(int j=1; j<=m; j++)
a[0][j]=a[1][j];//滚动数组,哈哈
v[i]=ma;
}
// for(int i=1; i<=n; i++) printf("%d ",v[i]);
// puts("");
int l,r;
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&l,&r);
if(v[r]>=r-l+1) puts("Yes");
else puts("No");
}
}
return 0;
}

D. Cloud of Hashtags

这个题也是很水的啊,只是题意花了点时间理解,然后样例也没有完全明白就直接写代码。就差两分钟又可以AC一道题啊~~

题意:有n的标签,现在要你不改变顺序的前提下使其变为字典序依次从小到大。

思路:其实明白了样例此题极水啊,最后一行不用变,我们秒想到从后往前推即可,用排在后面的给前面的作为参照,只要后面的有个字母比前面的大直接break,如果后面的某个字母比前面的小那么只能砍掉前面的了。字典序比较原则题目已经给出了。就看你代码实现了。

string s[N],s1[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
cin>>s[i];
for(int i=n-1; i>=0; i--)
{
s1[i]=s[i];
int len1=s[i].size();
if(i-1>=0)
{
int len2=s[i-1].size();
for(int j=0; j<=len1&&j<=len2; j++)
{
if(s[i][j]<s[i-1][j])
break;
if(s[i][j]>s[i-1][j]) break;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;s1[i][j]!='\0';j++)
cout<<s1[i][j];
cout<<endl;
}
return 0;
}

咸鱼未能翻身成功,就算涨了几分终究无法回到1500+。。

E题貌似也不难,看这么人做了,稍后补上。

E. Hanoi Factory

贪心水题。原来这场CF是模拟+贪心专场。

题意:汉诺塔大家都听过,现在有n个空心圆盘,每个内径a,外径b,高度c。求最高能垒多高,条件:上一层的外径必须要大于下一层的内径且小于等于下一层的外径。

思路:很明显一个贪心思路,将所有的圆盘按外径从大到小内径也从大到小排序。然后用栈存一下,遍历一遍即可。

这里内径为什么要从大到小呢?请看下面样例:

5

6 10 4

9 20 19

8 11 18

18 20 1

19 20 8

输出 50

排序之后:

19 20 8

18 20 1

9 20 19

8 11 18

6 10 4

50=8+1+19+18+4

而不是

9 20 19

18 20 1

19 20 8

8 11 18

6 10 4

41

struct S
{
int a,b,h;
} f[N];
int cmp(S x,S y)//外径大且内径大的优先
{
if(x.b!=y.b) return x.b>y.b;
return x.a>y.a;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++) scanf("%d%d%d",&f[i].a,&f[i].b,&f[i].h);
sort(f,f+n,cmp);
// puts("");
// for(int i=0;i<n;i++)
// printf("%d %d %d\n",f[i].a,f[i].b,f[i].h);
ll cnt=f[0].h,ma=cnt;
stack<S>q;
q.push(f[0]);
for(int i=1; i<n; i++)
{
while(!q.empty()&&f[i].b<=q.top().a)
{
cnt-=q.top().h;
q.pop();
}
q.push(f[i]);
cnt+=f[i].h;
ma=max(ma,cnt);
}
printf("%I64d\n",ma);
}
return 0;
}


Codeforces Round #401 (Div. 2) 离翻身就差2分钟的更多相关文章

  1. Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表

    题目链接:http://codeforces.com/contest/777/problem/C C. Alyona and Spreadsheet time limit per test 1 sec ...

  2. Codeforces Round #401 (Div. 2) D Cloud of Hashtags —— 字符串

    题目链接:http://codeforces.com/contest/777/problem/D 题解: 题意:给出n行字符串,对其进行字典序剪辑.我自己的想法是正向剪辑的,即先对第一第二个字符串进行 ...

  3. Codeforces Round #401 (Div. 2)

    和FallDream dalao一起从学长那借了个小号打Div2,他切ABE我做CD,我这里就写下CD题解,剩下的戳这里 AC:All Rank:33 小号Rating:1539+217->17 ...

  4. D Cloud of Hashtags Codeforces Round #401 (Div. 2)

    Cloud of Hashtags [题目链接]Cloud of Hashtags &题意: 给你一个n,之后给出n个串,这些串的总长度不超过5e5,你要删除最少的单词(并且只能是后缀),使得 ...

  5. C Alyona and Spreadsheet Codeforces Round #401(Div. 2)(思维)

    Alyona and Spreadsheet 这就是一道思维的题,谈不上算法什么的,但我当时就是不会,直到别人告诉了我,我才懂了的.唉 为什么总是这么弱呢? [题目链接]Alyona and Spre ...

  6. Codeforces Round #401 (Div. 2) A,B,C,D,E

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  7. Codeforces Round #401 (Div. 2) A B C 水 贪心 dp

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  8. Codeforces Round #401 (Div. 1) C(set+树状数组)

    题意: 给出一个序列,给出一个k,要求给出一个划分方案,使得连续区间内不同的数不超过k个,问划分的最少区间个数,输出时将k=1~n的答案都输出 比赛的时候想的有点偏,然后写了个nlog^2n的做法,T ...

  9. 【贪心】Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

    从后向前枚举字符串,然后从左向右枚举位. 如果该串的某位比之前的串的该位小,那么将之前的那串截断. 如果该串的某位比之前的串的该位大,那么之前那串可以直接保留全长度. 具体看代码. #include& ...

随机推荐

  1. 数据库查询,显示为树形结构(easyui+SSM)

    在实际项目上,有很多地方后台存了一个表,但是在显示查询的时候需要显示为树形结构. 本项目是easyui+SSM框架. 前台程序为: <!DOCTYPE html> <html> ...

  2. Django中对单表的增删改查

    之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象   book_obj=Book.objects.creat ...

  3. Sublime Text 3 使用小记

    快捷键: [ // 代码对齐插件 { "keys": ["shift+alt+a"], "command": "alignment ...

  4. 中国区 Azure 和全球版 Azure:功能对比

    由世纪互联运营的 Microsoft Azure(文中简称为中国区 Azure)是在中国大陆独立运营的公有云平台,与全球其他地区由微软运营的 Azure (文中简称全球版 Azure)服务在物理上和逻 ...

  5. codevs 1487 大批整数排序(水题日常)

     时间限制: 3 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题目描述 Description !!!CodeVS开发者有话说: codevs自从换了评测机,新评测机的内存计算 ...

  6. 51nod 1174 区间中最大的数(送盾题)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...

  7. powershell 版本问题

    Login-AzureRmAccount : 无法将“Login-AzureRmAccount”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确 ...

  8. asp.net core mvc 异步表单(Ajax.BeginForm)

    .net core中已经没有beginform扩展函数了. 通过Bower引入jquery-ajax-unobtrusive: <script src="~/lib/jquery-aj ...

  9. UVA 1151 Buy or Build (最小生成树)

    先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...

  10. 并查集+思维——The Door Problem

    一.问题描述(题目链接) 有n个门和m个开关,每个开关可以控制任意多的门,每个门严格的只有两个开关控制,问能否通过操作某些开关使得所有门都打开.(给出门的初始状态). 二.问题分析 大部分开关问题首先 ...