7-11 正整数A+B
这种水题都做了好久 还是有一个没过 不知道为什么 下次重新编
#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; }
看到一个比较好的方法
#include<iostream> #include<string> using namespace std; int main() { string a; getline(cin, a); int m = 0, n = 0;//所有字符串的和 int x = 0, y = 0;//只有数字的和 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; else cout << "?"; cout << " + "; if (n <= 1000 && n >= 1 && n == y) cout << n; else cout << "?"; cout << " = "; if (n <= 1000 && n >= 1 && m <= 1000 && m >= 1 && m == x&&n == y) cout << m + n; else cout << "?"; return 0; }
7-13 出租
写了挺久 虽然写出来了 但是感觉方法很简陋 其中 不知如何将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; }
看了别人的好方法
1 set<int, greater<int> > st; 这样就会从大到小排列 !!!
附上代码 他用的是建立数组 indx[num]=下标 我是把num map成下标 差不多
#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; }
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; else cout<<a[i+1][0].name; cout<<endl; } return 0; }
明明这么简单的题目 只要两个循环 一个从开头开始 一个从结尾开始 然后匹配 就直接打印 这么方便
#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; } }
7-19 红色警报
不知道该如何储存道路方便 感觉二维数组非常麻烦
用并查集
7-20 列车调度
还是超时
#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; }
要用二分查找 出第一个大于 aim的下标
#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; }
更为巧妙的方法 用内置函数
#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; }