Gym - 100703G-G-Game of numbers-暴力

来源:互联网 发布:知乎回答不了问题 编辑:程序博客网 时间:2024/05/18 10:15

给出n个数。。。初始值为零 对每一个数赋一个正或负号。使得,每次操作的值在【0,k】之间

输出最长的符号长度 及其符号

对每一个数 判断其正负数+前一个数(遍历)是否合法,如果合法且正 a[i]+x 标记为1,负标记为-1;

最后找到最后一个数,往前一直推即可得答案 



#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std; int a[1005][1005]; int  c[1005];char ans[1005];int main(){   int n,k; scanf("%d%d",&n,&k);int i,j;int tmp;for (i=1;i<=n;i++){scanf("%d",&tmp);c[i]=tmp; }a[1][c[1]]=1;for (i=2;i<=n;i++){int cnt=0;for (j=0;j<=1000;j++){if (a[i-1][j]){if (j+c[i]<=k){a[i][j+c[i]]=1;cnt=1;}if (j-c[i]>=0){a[i][j-c[i]]=-1;cnt=1;}}}if (cnt==0)break;}int mark=i-1;  //最长长度i--;printf("%d\n",mark);for (j=0;j<=1000;j++){if (a[mark][j]==1){ans[mark]='+';break;}elseif (a[mark][j]==-1){ans[mark]='-';break;}}i=j;if (ans[mark]=='+')i-=c[mark];elsei+=c[mark]; for (j=mark-1;j>=1;j--){if (a[j][i]==1)ans[j]='+';elseans[j]='-';if (a[j][i]==1)i-=c[j];elseif (a[j][i]==-1)i+=c[j];}for (i=1;i<=mark;i++){printf("%c",ans[i]);}cout<<endl;return 0;}


0 0
原创粉丝点击