比赛地址:http://codeforces.com/contest/586
A题
纯水题,so water ~~
题意:n,m分别是要求的字符串(数据范围太大只能是字符串)和 要求能被整除的数。
就是求一个长度为n的字符串能被m整除,就找找规律咯~ 1能被每个数整除 2-9 能被22222,3333,4444,55555,66666,77777,88888,99999这样的数整除,10能被10000这样的整除
有个小trick,就是当它长度为1的时候,它不可能被10整除,输出“-1”;
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int s1[500],s2[500],ss1[500],ss2[500],r[500]; int main() { int n; while(~scanf("%d",&n)) { for(int i=1; i<=n-1; i++) { scanf("%d",&s1[i]); } ss1[n]=0; for(int i=n-1; i>=1; i--) { ss1[i]=ss1[i+1]+s1[i]; } for(int i=1; i<=n-1; i++) { scanf("%d",&s2[i]); } ss2[n]=0; for(int i=n-1; i>=1; i--) { ss2[i]=ss2[i+1]+s2[i]; } for(int i=1; i<=n; i++) { scanf("%d",&r[i]); } int max1=INF; int k1; int vis[500]; memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { int sum=0; sum+=r[i]; sum+=ss2[i]; sum=sum+ss1[1]-ss1[i]; if(sum<max1) { k1=i; max1=sum; } } vis[k1]=1; int max2=INF; for(int i=1; i<=n; i++) { if(vis[i]==0) { int sum=0; sum+=r[i]; sum+=ss2[i]; sum=sum+ss1[1]-ss1[i]; if(sum<max2) { k1=i; max2=sum; } } } printf("%d ",max1+max2); } return 0; }
水题
AC代码:
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define INF 0x3f3f3f3f using namespace std; int s1[500],s2[500],ss1[500],ss2[500],r[500]; int main() { int n; while(~scanf("%d",&n)) { for(int i=1; i<=n-1; i++) { scanf("%d",&s1[i]); } ss1[n]=0; for(int i=n-1; i>=1; i--) { ss1[i]=ss1[i+1]+s1[i]; } for(int i=1; i<=n-1; i++) { scanf("%d",&s2[i]); } ss2[n]=0; for(int i=n-1; i>=1; i--) { ss2[i]=ss2[i+1]+s2[i]; } for(int i=1; i<=n; i++) { scanf("%d",&r[i]); } int max1=INF; int k1; int vis[500]; memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { int sum=0; sum+=r[i]; sum+=ss2[i]; sum=sum+ss1[1]-ss1[i]; if(sum<max1) { k1=i; max1=sum; } } vis[k1]=1; int max2=INF; for(int i=1; i<=n; i++) { if(vis[i]==0) { int sum=0; sum+=r[i]; sum+=ss2[i]; sum=sum+ss1[1]-ss1[i]; if(sum<max2) { k1=i; max2=sum; } } } printf("%d ",max1+max2); } return 0; }