1、node
一、ios
#include<iostream> #include<algorithm> using namespace std; struct node{ //結構體定義點 int x; int y; }d[1000]; int main() { int n; while(cin>>n) { int xmin,xmax,ymin,ymax; //四個最大最小座標點 for(int i=0;i<n;i++) { cin>>d[i].x>>d[i].y; } xmin=d[0].x; //賦初始值 xmax=d[0].x; ymin=d[0].y; ymax=d[0].y; for(int i=1;i<n;i++) { if(xmin>d[i].x){ xmin=d[i].x; } if(xmax<d[i].x){ xmax=d[i].x; } if(ymin>d[i].y){ ymin=d[i].y; } if(ymax<d[i].y){ ymax=d[i].y; } } int l; l=max(xmax-xmin,ymax-ymin); //求出面積 cout<<l*l; } return 0; }
經過率36% ,因爲忽略了int 的範圍。測試
int 範圍 [-2^31 , 2^31 -1] 即 [-2147483648,2147483647]spa
因此很容易溢出。3d
出錯blog
二、內存
#include<iostream> #include<algorithm> using namespace std; struct node{ //結構體定義點 long long x,y; }d[1000]; int main() { int n; while(cin>>n) { long long xmin,xmax,ymin,ymax; //四個最大最小座標點 for(int i=0;i<n;i++) { cin>>d[i].x>>d[i].y; } xmin=d[0].x; //賦初始值 xmax=d[0].x; ymin=d[0].y; ymax=d[0].y; for(int i=1;i<n;i++) { if(xmin>d[i].x){ xmin=d[i].x; } if(xmax<d[i].x){ xmax=d[i].x; } if(ymin>d[i].y){ ymin=d[i].y; } if(ymax<d[i].y){ ymax=d[i].y; } } long long l; l=max(xmax-xmin,ymax-ymin); //求出面積 cout<<(l*l); } return 0; } // 2 800000000 900000000 -800000000 -900000000
用 long long 數據格式才能夠。ci
各類數據類型範圍get
2、string
#include<iostream> #include<algorithm> #include<vector> #include<set> using namespace std; struct Que{ int s; int e; }; int N[2001]={0}; int ans[1000000]={0}; int Inqury(int a,int b,int *q) { set<int> s; for(int i=a;i<=b;i++) { s.insert(q[i]); } return s.size(); } int main() { int n,m,q; while(cin>>n>>m) { for(int i=1;i<=n;i++) { cin>>N[i]; } cin>>q; for(int i=0;i<q;i++) { int s,e,Num; cin>>s>>e; Num=Inqury(s,e,N); ans[i]=Num; } for(int i=0;i<q;i++) { cout<<ans[i]<<endl; } } }
測試用例:
8 6 1 3 2 2 4 2 5 6 3 1 3 2 5 1 6
3、
4、
一、
1.1
public static int win1(int[] arr) { if (arr == || arr.length == 0) { return 0; } return Math.max(f(arr, 0, arr.length - 1), s(arr, 0, arr.length - 1)); } public static int f(int[] arr, int i, int j) { if (i == j) { return arr[i]; } return Math.max(arr[i] + s(arr, i + 1, j), arr[j] + s(arr, i, j - 1)); /*當i!=j時,說明至少還有兩張紙牌,那麼先手的人就有選擇,是先拿第一張,仍是拿最後一張。 若是拿了第一張,那麼剩下i+1到j的牌裏他就是後手, 同理先拿了最後一張,那麼他在i到j-1裏後手。 都是絕對理性的個體,因此二者選大的拿走即爲他的分數。*/ } public static int s(int[] arr, int i, int j) { if (i == j) { return 0; } return Math.min(f(arr, i + 1, j), f(arr, i, j - 1)); /*當i!=j時,說明至少還有兩張紙牌,那麼先手的人就有選擇,是先拿第一張,仍是拿最後一張。 若是拿了第一張,那麼後手的人在剩下i+1到j的牌裏他就是先手, 同理若是先手拿了最後一張,那麼後手的人在i到j-1裏先手。 都是絕對理性的個體,因此先手必定會把更小的留給他。*/ }
1.2 動態規劃 解法
#include <iostream> #include <vector> #include<string.h> using namespace std; int cardGame(vector<int> A, int n) { //紙牌博弈 int dp[n][n]={0}; int dp1[n][n]={0}; //置0; //memset(dp,0,sizeof(dp)); //memset(dp1,0,sizeof(dp1)); //置0 的另外一種方法,庫爲 string.h for(int j = 0 ;j < n ; j++) { dp[j][j] = A[j]; for(int i = j - 1;i >= 0; i--) { dp[i][j] = max((A[i] + dp1[i + 1][j]) , (A[j] + dp1[i][j - 1])); dp1[i][j] = min(dp[i + 1][j] , dp[i][j - 1]); } } cout<<endl; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<dp[i][j]<<" "; cout<<endl; } cout<<endl; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<dp1[i][j]<<" "; cout<<endl; } cout<<endl; return max(dp[0][n - 1],dp1[0][n - 1]); } int main() { int T = 0; cin >> T; //測試用例數 vector<int> vec; for(int i=0;i<T;i++) { int tem; cin>>tem; vec.push_back(tem); } cout<<cardGame(vec,T); return 0; } //4 1 2 100 4 //6 4 7 2 9 5 2 // 4 4 7 2 2
三、來回挑最大的
#include <iostream> #include <vector> #include<string.h> using namespace std; int main() { int T = 0; cin >> T; //測試用例數 vector<int> vec; for(int i=0;i<T;i++) { int tem; cin>>tem; vec.push_back(tem); } int a=0,b=0; int flag=0; while(vec.size()>0) { if(flag==0) { a+=max(vec[0],vec[vec.size()-1]); if(vec[0]>=vec[vec.size()-1]) vec.erase(vec.begin()); else vec.pop_back(); flag=1; } else { b+=max(vec[0],vec[vec.size()-1]); if(vec[0]>=vec[vec.size()-1]) vec.erase(vec.begin()); else vec.pop_back(); flag=0; } } cout<<a<<" "<<b; return 0; } //4 1 2 100 4 //6 4 7 2 9 5 2 // 4 4 7 2 2
該題是上題的變形。
5、內存管理
#include <iostream> #include <vector> #include <string> using namespace std; struct mem //定義結構體 { int no; //編號,內存,開始,結束 int size; int start; int end; }; vector<mem> vec; int cnt = 0; int tail; int del(int no) { for (vector<mem>::iterator it = vec.begin(); it != vec.end(); it++) { if ((*it).no == no) { vec.erase(it); return no; } } return -1; } int def() { for (vector<mem>::iterator it = vec.begin() + 1; it != vec.end() - 1; it++) { if ((*it).no == 0) { continue; } (*it).start = (*(it - 1)).end + 1; (*it).end = (*it).start + (*it).size - 1; } if (vec.size() == 2) { tail = (*(vec.end() - 1)).start; } else { tail = (*(vec.end() - 1)).start - (*(vec.end() - 2)).end - 1; } return -1; } int newMem(int sz) { for (vector<mem>::iterator it = vec.begin() + 1; it != vec.end(); it++) { if ((*it).start - (*(it - 1)).end - 1 >= sz) { cnt++; mem tmp = { cnt, sz, (*(it - 1)).end + 1, (*(it - 1)).end + sz }; vec.insert(it, 1, tmp); tail -= sz; return cnt; } } vector<mem>::reverse_iterator it = vec.rbegin(); if (tail >= sz) { cnt++; vec.push_back({ cnt, sz, (*it).end + 1, (*it).end + sz }); tail -= sz; return cnt; } return -1; } int main() { int n = 0; while (cin >> n >> tail) //n,輸入任務 ;tail內存 { vec.clear(); cnt = 0; vec.push_back({ 0, 0, -1, -1 }); vec.push_back({ 0, 0, tail, -1 }); string str; while (n--) { cin >> str; if (str.compare("new") == 0) { int sz; cin >> sz; int res = newMem(sz); if (res == -1) { //printf("NULL\n"); cout<<"NULL"<<endl; } else { cout << res << endl; } } else if (str.compare("del") == 0) //刪除 { int tmp; cin >> tmp; if (tmp <= 0) { //printf("ILLEGAL_OPERATION\n"); cout<<"ILLEGAL_OPERATION"<<endl; } else { int res = del(tmp); if (res == -1) { //printf("ILLEGAL_OPERATION\n"); cout<<"ILLEGAL_OPERATION"<<endl; } } } else //def { def(); } for(int i=0;i<vec.size();i++) { cout<<vec[i].no<<" "<<vec[i].size<<" "<<vec[i].start<<" "<<vec[i].end<<endl; } } } return 0; }
樣例
6 10 new 5 new 3 del 1 new 6 def new 6
二、
#include <iostream> #include <vector> #include <string> using namespace std; struct mem //定義結構體 { int no; //編號,內存,開始,結束 int size; int start; int end; }; vector<mem> vec; int cnt = 0; int tail; int del(int no) { for (int i=0; i<vec.size(); i++) { if (vec[i].no == no) { vec.erase(vec.begin()+i); return no; } } return -1; } int def() { for (int i =1; i<vec.size() - 1; i++) { if (vec[i].no == 0) { continue; } vec[i].start = vec[i-1].end + 1; vec[i].end = vec[i].start + vec[i].size - 1; } return -1; } int newMem(int sz) { for (int i= 1; i< vec.size(); i++) { if (vec[i].start - vec[i-1].end - 1 >= sz) { cnt++; mem tmp = { cnt, sz, vec[i-1].end + 1, vec[i-1].end + sz }; vec.insert(vec.begin()+i, 1, tmp); return cnt; } } return -1; } int main() { int n = 0; while (cin >> n >> tail) //n,輸入任務 ;tail內存 { vec.clear(); cnt = 0; vec.push_back({ 0, 0, -1, -1 }); vec.push_back({ 0, 0, tail, -1 }); string str; while (n--) { cin >> str; if (str.compare("new") == 0) { int sz; cin >> sz; int res = newMem(sz); if (res == -1) { cout<<"NULL"<<endl; } else { cout << res << endl; } } else if (str.compare("del") == 0) //刪除 { int tmp; cin >> tmp; if (tmp <= 0) { cout<<"ILLEGAL_OPERATION"<<endl; } else { int res = del(tmp); if (res == -1) { cout<<"ILLEGAL_OPERATION"<<endl; } } } else //def { def(); } for(int i=0;i<vec.size();i++) { cout<<vec[i].no<<" "<<vec[i].size<<" "<<vec[i].start<<" "<<vec[i].end<<endl; } } } return 0; }
將迭代器換成了下標表示。
1 5 0 4 分別表示第1個任務,佔據5個內存,內存地址開始爲0,結束爲4
2 3 5 7 表示第2個任務,佔據3個內存,內存地址開始爲5,結束爲7
0 0 10 -1 默認存儲最大值爲10
del 就是查詢下標,vector 刪除
new 依次查詢,相鄰任務間的內存差值,大於要存的內容,就保存。例如,上面任務2存在位置5到7,佔了3個內存。因此用2號任務開始的地址減去上一個任務結束的地址,能夠知道他們之間有了5-(-1)-1=5的內存空間,若是該內存空間大於目標內存,就能夠將目標內存存在該處;
def 首先找到任務編號爲1的任務,而後將其開始內存地址置爲0( vec[i-1].end + 1;),而後結束座標地址爲開始地址加上內存空間;下一個任務,開始地址爲上一個任務結束地址+1;
這樣就實現了內存管理。