越学越废,呵呵呵呵。
没事,再接再厉就好了
乐乐的数字:
题目描述
乐乐做完数学作业,突发奇想定义了一种新的数:乐乐数。乐乐把n个数排成一行,一个数的“乐乐数”是指:在这个数的左边且比它小的数中最靠近它(即最靠右)的那个数。依次给出这n个数,请求出所有这n个数相对应的“乐乐数”。输入
第一行是一个正整数n,表示一共有多少个数。第二行有n个用空格隔开的正整数,它们从左至右给出了数列中的n个数。这些数保证小于231。
输出
输出一行用空格隔开的n个数。这些数对应于输入数据中的数的“乐乐数”。如果输入中某个数没有“乐乐数”(即它左边的数都不比它小),请输出0。
样例输入 Copy
7 3 1 2 7 6 7 4
样例输出 Copy
0 0 1 2 2 6 2
提示
对于80%的数据,n≤10000;对于100%的数据,n≤200000。 题解:都是补题哈哈,借鉴了大佬的代码,看懂之后着实佩服,还有人跟我说可以用单调栈做,等我研究出来重新补发哈,这题我个菜鸡首先想到的是循环,暴力来做,一次循环再加上break依然超时 大佬的想法是用空间换时间,用一个数组来专门记录答案,还有个数组就是移动来找那个数字,还有个原数组,把思路想明白,直接模拟(虽然我当时没做出来,呵呵了
#include<iostream> using namespace std; typedef long long int ll; int b[1000000],a[1000000],c[1000000]; ll t; int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { if(a[i-1]>=a[i]) { int t=c[i-1];//再往前看一个数 while(t>0&&a[t]>=a[i]) t=c[t]; b[i]=a[t]; c[i]=t; } else { b[i]=a[i-1];//如果前一个数刚好比这个数要小,那正好的 c[i]=i-1;//表示位置 } } for(int i=1;i<=n;i++) printf("%d ",b[i]); return 0; }
题目描述
乐乐最近玩起了字符游戏,规则是这样的:读入四行字符串,其中的字母都是大写的,乐乐想打印一个柱状图显示每个大写字母的频率。你能帮助她吗?输入
共有4行:每行为一串字符,不超过72个字符。输出
与样例的格式保持严格的一致。样例输入 Copy
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HISTOGRAM PROGRAM. HELLO!
样例输出 Copy
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
提示
1.输出的相邻字符间有一个空格。2.最后一行的26个大写字母每次必须输出。
3.大写字母A所在的第一列前没有空格。
#include<iostream> #include<cstring> using namespace std; int main(){ int n=4,len,maxn=0,a[10000]; char ch[100]; while(n--) { cin.getline(ch,100); len=strlen(ch); for(int i=0;i<len;i++) { if(ch[i]>='A'&&ch[i]<='Z') { a[ch[i]-'A']++; maxn=max(maxn,a[ch[i]-'A']); } } } for(int i=maxn;i>0;i--)//代表个数木桶效应,所有的个数都比maxn要小 { for(int j=0;j<26;j++)//一排一排往下走 { if(j==0) { if(a[j]>=i) printf("*"); else printf(" "); } else { if(a[j]>=i) printf(" *"); else printf(" "); } } cout<<endl; } printf("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n"); }