訓練指南書上推理是對的,但書上代碼個人覺得是有問題的,但卻能夠AC,真是不解。#include <iostream>using namespace std;int a[100005],elft[2],rig[2],n;int OK(int ans){int x=a[1],y=ans-a[1],id=0,i;elft[0]=x;
枚舉剩下的序列即可: f(i,j)表示從i到j玩家一取得的最大值,sum[i][j]表示從i到j的和。 f(i,j)=sum[i][j]-min(f(i,k),f(k+1,j),0) i<=j, i<=k<j。#include <iostream>#include <cstring>using namespace std;int a[105],n,sum[105],bz[105][105],d[105][105];int
#include <iostream>using namespace std;#include<cmath>#include <cstdio>struct point{ float l,r;}p[10005];int main(int argc, char *argv[]){ float w,h,s,x1,x,r,x2; int i,n,ans; while (scanf("%d%f%f",&n,&w,&h)!=
#include <iostream>#include<vector>#Include<cstring>using namespace std;vector<int> m[100005];int a[100005];void f(int k){ for(int i=0;i<m[k].size();i++){ if(a[m[k][i]]==0) {a[m[k][i]]=k; f(m[k][i]);
//記憶式遞迴 #include <iostream>#include <cstring>using namespace std;int d[305][305];int f(int i,int j){if(d[i][j]!=-1) return d[i][j];if(i==1) return d[i][j]=j-1;if(j==1) return d[i][j]=i-1;if(i%2==0) return d[i][j]=2*f(i/2,j)+1;else if(j%2=
#include <iostream>#include <algorithm>using namespace std;int n,p[105]; struct bian{ int x,y,d; }e[5105];//wa了n次,居然是數組開小了,提交時不提示運行錯誤,直接wa,無語……int cmp(bian a1,bian b1){ return a1.d<b1.d;}void init(){ for(int i=1;i<=n;i++)
#include<iostream>#include<string.h>#include<algorithm>using namespace std;int main(){ char s1[105],s2[105]; int i,j; while(cin>>s1>>s2) {if(strlen(s1)!=strlen(s2)) {cout<<"NO"<<endl;continue;} int a[26]=
這題我用long long 死活過不去。看了別人的結題報告才知道要這樣輸出:cout<<(unsigned long long)sum<<endl;unsigned long long的範圍比long long的要大,題目後面也說了要用unsigned 64位,只是自己沒看而已。這題看幾個例子就知道,每結果的每一位都是若干個輸入的元素的和,只是每個元素多少個而已。 例如: 輸入: 52 2 2 3 4有三種元素,以及每種的個數:
#include <iostream>#include <cmath>using namespace std;const double PI=acos(-1.0); //3.14過不了 double area[10005];double max_area;int n,f;int OK(double k){int i,Count=0;for(i=0;i<n;i++)Count+=floor(area[i]/k);return
#include <iostream>#include <cstdio>#include<algorithm>#include<string>using namespace std;struct cha{ string a; }d[55];int cmp(cha A,cha B) //用字串比較函數直接比較不行的,例如563,56 { string c,d; c=A.a+B.a;d=B.a+A.a;return c>d;}int
#include <iostream>using namespace std;int t[20][20],bz[20],m[20],n,s;void f(int k){ int i;if(s==n){for(i=0;i<n-1;i++)cout<<m[i]<<" ";cout<<m[i]<<endl;}else for(i=0;i<n;i++) if(bz[i]==0&&t[k][i]==1)
此題運用快速冪和組合公式對於選人的方案可以是:∑C(n,k)C(k,1) 其中k從1到n 所有組合數相加。對於C的公式有:C(n,k)C(k,r)=C(n,r)C(n-r,k-r)(k>=r)化簡後 C(n,1)C(n-1,k-1)其中C(n,1)是常數n提出來,那麼裡面就是∑C(n-1,k-1)其中k從1 到n 那麼這個就是組合公式的全集 也就是2^(n-1)所以此題答案就是n*(2^(n-1)) 但是n打到10^9 所以需要用到快速冪。#include
//從1到m中取n個數,不允許重複取數#include <iostream>using namespace std;int n,a[10];bool bz[10];void output(){ int i; for (i=1;i<=n; i++) cout<<a[i]<<" "; cout<<endl;}void f(int cur) //回溯{ if (cur==n+1)
題意:給出一個n*n的0,1矩陣,把盡量少的0改成1,使得每個元素的上下左右的元素之和都為偶數思路:枚舉第一行就行,剩下的n-1行根據前一行遞推出來#include <iostream>using namespace std;int map[20][20],tt[20][20],mi,n,k;int qiuhe(int ii,int jj) //求第(ii,jj)上下左右之和{int s=0;if(ii-1>=0) s+=tt[ii-1][jj];if(jj-1>=0)
在N個數中找出其和為M的若干個數。先讀入正整數N(1<N<100)和M(1<M<10000), 再讀入N個正數(可以有相同的數字,每個數字均在1000以內), 在這N個數中找出若干個數, 使它們的和是M, 把滿足條件的數字組合都找出來以統計組合的個數,輸出組合的個數(不考慮組合是否相同)。要求你的程式已耗用時間不超過1秒。 輸入格式 Input Format 第一行是兩個數字,表示N和M。第二行起是N個數。 輸出格式 Output
#include <iostream>#include <cstdio>using namespace std;long long f(int temp[],int i,int aim){if(!i) return 0; /*剛好i就在aim上i就不用移動,否則先把i上面的i-1個移到中轉上, 在把i移到aim上(1次),最後把i-1個全部移到aim上:((1<<(i-1))-1)次 */ if(temp[i]==aim) return f(temp,i-1,
#include <iostream>using namespace std;char map[15][15];int n;char min_A(int i,int j){char a='A';int flag=1;while(flag){ flag=0;if(i>0&&map[i-1][j]==a) {flag=1;a++;}if(i+1<n&&map[i+1][j]==a)
方法1:string類void add(string &s1,string s2)//s1=s1+s2 {int i,j,sum=0;if(s1.length()<s2.length()) swap(s1,s2); for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) { sum+=s1[i]-'0'; if(j>=0) sum+=s2[j]-'0'; s1[i]=sum%10+'
點擊開啟題目連結#include <iostream>#include<string>using namespace std;int i;string s;int f(){i++; int x=0;while((s[i]==')'||s[i]==',')&&i<s.length()) i++;while(s[i]>='0'&&s[i]<='9'&&i<s.length()){x=x*10+(s[i]-
erase函數的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator position );(3)iterator erase ( iterator first, iterator last );也就是說有三種用法:(1)erase(pos,n);