usaco ★Zero Sum 和为零
生活随笔
收集整理的這篇文章主要介紹了
usaco ★Zero Sum 和为零
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
★Zero Sum 和為零
請考慮一個由 1 到 N(N=3, 4, 5 ... 9)的數字組成的遞增數列:1 2 3 ... N.
現在請在數列中插入“+”表示加,或者“-”表示減,抑或是“ ”表示空白,來將每一對數字組合
在一起(請不在第一個數字前插入符號).
計算該表達式的結果并注意你是否得到了和為零.
請你寫一個程序找出所有產生和為零的長度為 N 的數列.
PROGRAM NAME: zerosum
INPUT FORMAT
單獨的一行表示整數 N (3 <= N <= 9).
SAMPLE INPUT (file zerosum.in)
7
OUTPUT FORMAT
按照 ASCII 碼的順序,輸出所有在每對數字間插入“+”, “-”, 或 “ ”后能得到和為零的數
列.(注意:就算兩個數字之間沒有插入符號也應該保留空格)
SAMPLE OUTPUT (file zerosum.out)
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
請考慮一個由 1 到 N(N=3, 4, 5 ... 9)的數字組成的遞增數列:1 2 3 ... N.
現在請在數列中插入“+”表示加,或者“-”表示減,抑或是“ ”表示空白,來將每一對數字組合
在一起(請不在第一個數字前插入符號).
計算該表達式的結果并注意你是否得到了和為零.
請你寫一個程序找出所有產生和為零的長度為 N 的數列.
PROGRAM NAME: zerosum
INPUT FORMAT
單獨的一行表示整數 N (3 <= N <= 9).
SAMPLE INPUT (file zerosum.in)
7
OUTPUT FORMAT
按照 ASCII 碼的順序,輸出所有在每對數字間插入“+”, “-”, 或 “ ”后能得到和為零的數
列.(注意:就算兩個數字之間沒有插入符號也應該保留空格)
SAMPLE OUTPUT (file zerosum.out)
1+2-3+4-5-6+7
1+2-3-4+5+6-7
1-2 3+4+5+6+7
1-2 3-4 5+6 7
1-2+3+4-5+6-7
1-2-3-4-5+6+7
這題最難的點就是得到一個字符序列后判斷他的值是不是0了這一步占了我整個代碼長度的3/5,而且花了很長時間。總之這題花了很長時間==。
而且他要求我按ascll順序,所以wa了一發。我不知道是什么順序就把switch后面那三個+ -space 交換了順序跟樣例進行比較。
/*
ID:jinbo wu
LANG:C++
TASK:zerosum
*/
#include<bits/stdc++.h>
using namespace std;
int m;
char c[100];
bool num(char b)
{if(b>=48&&b<=57)return true;return false;}
void dfs(int n,int cnt,int l)
{switch(cnt){case 1:{c[l++]=' ';c[l++]=48+n;break;}case 2:{c[l++]='+';c[l++]=48+n;break;}case 3:{c[l++]='-';c[l++]=48+n;}}if(n==m){int sum=0;int flag=0;int k=0;c[l]='\0';for(int i=0;i<l;i++){if(c[i]==' ')continue;if(c[i]=='+'){flag=0;continue;}if(c[i]=='-'){flag=1;continue;}if(k==0){if(num(c[i])&&c[i+1]!=' '){if(flag==0)sum+=(c[i]-'0');if(flag==1)sum-=(c[i]-'0');}else if(num(c[i])&&c[i+1]==' ')k=c[i]-'0';}else{if(num(c[i])&&(c[i+1]!=' '||c[i+1]=='\0')){k=k*10+c[i]-'0';if(flag==0)sum+=k;if(flag==1)sum-=k;k=0;}else if(num(c[i])&&c[i+1]==' '){k=k*10+c[i]-'0';}}}if(sum==0){for(int i=0;i<l;i++)cout<<c[i];cout<<endl;}return;}for(int i=1;i<=3;i++)dfs(n+1,i,l);
}
int main()
{freopen("zerosum.in","r",stdin);freopen("zerosum.out","w",stdout);cin>>m;c[0]='1';for(int i=1;i<=3;i++)dfs(2,i,1);
}
總結
以上是生活随笔為你收集整理的usaco ★Zero Sum 和为零的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 但愿人长久千里共婵娟是谁写的呢?
- 下一篇: usaco Money system