A题:
给出一个数列,由0或者5组成,求这里面由0或者5所能组成的数里面,能被90整除的数的最大值。
AC代码:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int n; while(scanf("%d", &n)!=EOF) { int tmp, cnt0 = 0, cnt5 = 0; for(int i = 1; i <= n; i++) { scanf("%d", &tmp); if(tmp == 0) cnt0++; else cnt5++; } if(cnt0 == 0) printf("-1\n"); else if(cnt5 < 9) printf("0\n"); else { for(int i = 1; i <= (cnt5/9)*9; i++) printf("5"); for(int i = 1; i <= cnt0; i++) printf("0"); } puts(""); } return 0; }
B题:
给出一个数列,求在相同位置上所能满足等差数列的条件的值和差值。
AC代码:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; const int maxn=100100; int flag[maxn]; int t[maxn]; struct node { int c; int d; bool flag; }D[maxn]; int main() { int n,x,len=0; cin>>n; memset(D,0,sizeof(D)); memset(flag,0,sizeof(flag)); memset(t,0,sizeof(t)); for(int i=1;i<=n;i++) { scanf("%d",&x); if(!flag[x]) { t[len++]=x; flag[x]=1; D[x].c=i; D[x].d=0; D[x].flag=false; } else { if(D[x].d==0) { D[x].d=i-D[x].c; D[x].c=i; } else { if(i-D[x].c==D[x].d) D[x].c=i; else D[x].flag=true; } } } sort(t,t+len); //cout<<len<<endl; int ans=0; for(int i=0;i<len;i++) { int xx=t[i]; if(!D[xx].flag) ans++; } cout<<ans<<endl; for(int i=0;i<len;i++) { int xx=t[i]; if(!D[xx].flag) printf("%d %d\n",xx,D[xx].d); } return 0; }
给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小。
考虑小数点后面的数字,如果这些数都非零,则就是 abs(原数小数部分相加-1*n), 多一个0 则 min( abs(原数小数部分相加-1*n) ,abs(原数小数部分相加-1*(n-1)) )
AC代码:
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <algorithm> #define INF 0x7fffffff; using namespace std; int main() { int n; scanf("%d", &n); int x, len = 0, sum = 0; for(int i = 0; i < n*2; i++) { scanf("%*d.%d", &x); sum += x; if(x == 0) len++; } int ans = INF; for(int i = 0; i <= len; i++) ans = min(ans, abs(sum - (1000*n - 1000*i))); printf("%d.%03d\n", ans/1000, ans%1000); return 0; }