A题,是个水题。思路参见代码:
#include <iostream> #include <cstdio> using namespace std; int main() { string s; cin>>s; for(int i=s.size()-1;i>=0;i--) { if(s[i]=='0') printf("O-|-OOOO\n"); if(s[i]=='1') printf("O-|O-OOO\n"); if(s[i]=='2') printf("O-|OO-OO\n"); if(s[i]=='3') printf("O-|OOO-O\n"); if(s[i]=='4') printf("O-|OOOO-\n"); if(s[i]=='5') printf("-O|-OOOO\n"); if(s[i]=='6') printf("-O|O-OOO\n"); if(s[i]=='7') printf("-O|OO-OO\n"); if(s[i]=='8') printf("-O|OOO-O\n"); if(s[i]=='9') printf("-O|OOOO-\n"); } return 0; } |
* This source code was highlighted by YcdoiT. ( style: Peaksea )
B题,给定一串数字,然后求出长度为k的区间内数字最小值的那段区间的起始坐标,听着有点绕,举个例子。。1 2 6 1 1 7 1.。求出长度为3的区间内数字之和最小的那段区间的起始坐标,答案是3,因为6+1+1=8是最小的值,而这段区间的起始坐标为3.所以输出3.
思路:先求出前k个数的值,此后就是不断维护这个数,每次减去这段区间的最前面那个数,加上最后面那个数,得到一个新的res,和原来的res比较,如果更优,则不断更新,起始坐标和该最小值即可在现行时间内解决该问题。应该是最大连续子序列的一个简单变形。对时间复杂度要求挺高,暴力枚举显然是不行的。上面的作法可以在O(n)时间内解决该问题。
/********************** * author:crazy_石头 * Pro:Fence * algorithm:枚举 * Judge Status:Accepted ***********************/ #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; #define rep(i,h,n) for(int i=(h);i<=(n);i++) const int maxn=500+5; int a[maxn]; int main() { int st; int n,k,cur,res,pos; scanf("%d%d",&n,&k); rep(i,0,n-1) scanf("%d",&a[i]); cur=0; rep(i,0,k-1) cur+=a[i]; res=cur; rep(i,k,n-1) { res+=a[i]-a[i-k+1]; if(res<=cur) { cur=res; st=i-k+2; } } cout<<st<<endl; return 0; } |
* This source code was highlighted by YcdoiT. ( style: Vs )
C题,和昨晚的一个题目听说挺像的,我也不知道,今天看了看。贴上一份别人的精简代码,我的太挫。。。
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; char s[200005],a[200005]; int N,b[200005]; int main() { scanf("%s",s+1),N=strlen(s+1); for (int i=1,t=0; i<=N; i++) { if (s[i]!=a[t]) a[++t]=s[i],b[t]=0; else if ((t==1)&&(s[i]==a[t])) a[++t]=s[i],b[t]=1; else if (t>1&&s[i]==a[t]&&a[t]!=a[t-1]&&!b[t-1]) a[++t]=s[i],b[t]=1; } printf("%s\n",a+1); } |
* This source code was highlighted by YcdoiT. ( style: Autumn )