周练2
7-11?正整數(shù)A+B
這種水題都做了好久 ?還是有一個(gè)沒過 不知道為什么 ?下次重新編
#include <bits/stdc++.h>using namespace std;int main() {string s; getline(cin,s); int fa=1,fb=1;int a=0,b=0; int i; //if(s[0]==' ')fa=0; for( i=0;s[i]!=' ';i++) {//printf("%d\n",s[i]-'0');if(i==0&&s[i]=='0')fa=0;if(!((s[i]-'0')<=9&&(s[i]-'0')>=0)){fa=0;}else a=a*10+s[i]-'0';} for(int k=i+1;s[k]!=' '&&s[k]!='\0';k++) {// printf("%d ",s[k]-' ');if(k==i+1&&s[k]=='0')fb=0;if(!((s[k]-'0')<=9&&(s[k]-'0')>=0)){fb=0;break;}else b=b*10+s[k]-'0'; } if(a>1000||a==0)fa=0; if(b>1000||b==0)fb=0;if(fa)printf("%d",a); else printf("?"); printf(" + "); if(fb)printf("%d",b); else printf("?"); printf(" = "); if(fa&&fb)printf("%d",a+b); else printf("?");return 0; } View Code?
看到一個(gè)比較好的方法
#include<iostream> #include<string> using namespace std; int main() {string a;getline(cin, a);int m = 0, n = 0;//所有字符串的和int x = 0, y = 0;//只有數(shù)字的和int i = 0;for (i; i<a.length(); i++){if (a[i] == ' ') break;m = m * 10 + (a[i] - '0');if (a[i] >= '0'&&a[i] <= '9'){x = x * 10 + (a[i] - '0');}}for (int j = i + 1; j<a.length(); j++){//if(a[j]==' ') break; n = n * 10 + (a[j] - '0');if (a[j] >= '0'&&a[j] <= '9'){y = y * 10 + (a[j] - '0');}}if (m <= 1000 && m >= 1 && m == x)cout << m;elsecout << "?";cout << " + ";if (n <= 1000 && n >= 1 && n == y)cout << n;elsecout << "?";cout << " = ";if (n <= 1000 && n >= 1 && m <= 1000 && m >= 1 && m == x&&n == y)cout << m + n;elsecout << "?";return 0; } View Code?
?
7-13?出租
寫了挺久 雖然寫出來了 ? ? 但是感覺方法很簡(jiǎn)陋 ?其中 不知如何將set倒敘輸出和處理卡了很久 還有 注意-‘0’
#include <bits/stdc++.h>using namespace std;bool aaa(char *a); int main() {string s; getline(cin,s);set<int>a; map<int,int>ma;for(int i=0;i<s.size();i++) {if(!a.count(s[i])){a.insert(s[i]);}} int n1=a.size(); int c=0;printf("int[] arr = new int[]{");int first=1;int scend=1;int c1=0;for (set<int>::iterator it = a.end(); ; --it){if(first){first=0;}else if(scend){scend=0; ma[*it-'0']=c++; cout<<*it-'0'; c1++;}else if(c1<a.size()){c1++; ma[*it-'0']=c++; cout<<","<<*it-'0';}else break;}printf("};\n");printf("int[] index = new int[]{");first=1; for(int i=0;i<s.size();i++) {if(first){first=0;cout<<ma[s[i]-'0'];}else cout<<','<<ma[s[i]-'0'];} printf("};");return 0; } View Code?
看了別人的好方法
1?set<int, greater<int> > st; 這樣就會(huì)從大到小排列 !!!
附上代碼 ? 他用的是建立數(shù)組 indx[num]=下標(biāo) ?我是把num map成下標(biāo) ?差不多
#include "algorithm" #include "set" #include "vector" #include "iostream" #include "cstdio"using namespace std;const int maxn = 11 + 10;int main() {set<int, greater<int> > st;vector<int> phone;int tmp;string str;getline(cin, str);for(int i = 0; i < str.length(); i++){phone . push_back(str[i]-'0');st.insert(str[i] - '0');}set<int>::iterator it = st . begin();int index[maxn] = {0};tmp = 0;int tmpindex = *it;index[tmpindex] = tmp++;cout << "int[] arr = new int[]{" << *it++;for (; it != st . end(); it++) {cout << "," << *it;tmpindex = *it;index[tmpindex] = tmp++;}cout << "};" << endl;cout << "int[] index = new int[]{" << index[phone[0]];for (int i = 1; i < phone . size(); i++) {cout << "," << index[phone[i]];}cout << "};" << endl;return 0; } View Code?
?
?
7-16?一幫一
雖然過了 但是用了及其腦殘加繞的方法 ?
#include <bits/stdc++.h>using namespace std;struct stdu {string name;int f; }a[100][2];vector<string>na; int main() { int n;cin>>n;int c=0,c1=0; for(int i=1;i<=n/2;i++) { int sec;cin>>sec;if(sec==0){cin>>a[++c][0].name; na.push_back(a[c][0].name); a[c][0].f=1;}else{cin>>a[++c][1].name; na.push_back(a[c][1].name); a[c][1].f=1;}}for(int i=n/2+1;i<=n;i++) { int sec;cin>>sec;if(sec==0){for(int k=n/2;k>=1;k--)if(a[k][0].f!=1){cin>>a[k][0].name;a[k][0].f=1;break;}}else if(sec==1){for(int k=n/2;k>=1;k--)if(a[k][1].f!=1){cin>>a[k][1].name;a[k][1].f=1;break;}}} for(int i=0;i<=n/2-1;i++){cout<<na[i]<<" ";if(na[i][1]==a[i+1][0].name[1]&&na[i][2]==a[i+1][0].name[2])cout<<a[i+1][1].name;elsecout<<a[i+1][0].name;cout<<endl;}return 0; } View Code?
明明這么簡(jiǎn)單的題目 ?只要兩個(gè)循環(huán) 一個(gè)從開頭開始 一個(gè)從結(jié)尾開始 ?然后匹配 ?就直接打印 ?這么方便 ?
#include<stdio.h> struct node {int sex;char name[10];int flag; }data[51]; int main() {int n;int count=0;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d %s",&data[i].sex,&data[i].name);data[i].flag=0;}for(int i=0;i<n/2;i++){for(int j=n-1;j>=n/2;j--){if((data[i].sex!=data[j].sex)&&data[i].flag==0&&data[j].flag==0){data[i].flag =1;data[j].flag =1;count=count+2;printf("%s %s\n",data[i].name ,data[j].name );}}if(count==n)break;} } View Code?
?
7-19?紅色警報(bào)
不知道該如何儲(chǔ)存道路方便 感覺二維數(shù)組非常麻煩
用并查集
?
?
?
?
7-20?列車調(diào)度
還是超時(shí)
#include <bits/stdc++.h>using namespace std;int main() {int n;cin>>n;int a[100005]; int n1=1; int x;cin>>x; a[0]=x; for(int i=2;i<=n;i++) {int x;cin>>x;for(int j=0;j<=n1;j++){if(x<a[j]){a[j]=x;break;}if(j==n1){a[n1]=x;n1++;break;}}}printf("%d",n1);return 0; } View Code要用二分查找 出第一個(gè)大于 aim的下標(biāo)
#include <bits/stdc++.h>using namespace std;int ef(int left,int right,int aim,int *a); int main() {int n;cin>>n;int a[100005]; int n1=1; int x;cin>>x; a[0]=x; for(int i=2;i<=n;i++) {int x;cin>>x;int n2=ef(0,n1-1,x,a);if(n2>n1-1){a[n1]=x;n1++;}else a[n2]=x;}printf("%d",n1);return 0; }int ef(int left,int right,int aim,int *a) {while (left <= right) {int mid = (left + right) / 2;if (a[mid] > aim) {right = mid - 1;}else {left = mid + 1;}}return left;} View Code?
?更為巧妙的方法 用內(nèi)置函數(shù)
#include <bits/stdc++.h>using namespace std; const int MAXN=40; int n,m; set<int>q; int main() {scanf("%d",&n);int x;for(int i=0;i<n;++i){scanf("%d",&x);if(q.upper_bound(x)!=q.end()){q.erase(q.upper_bound(x));}q.insert(x);}printf("%u\n",q.size());return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/bxd123/p/10183176.html
總結(jié)
- 上一篇: [LuoguP1064][Noip200
- 下一篇: error CS1002: ; expe