⛳6.成绩统计
#include <iostream> using namespace std; int score[1001]; int main() { int n; int jg=0; int yx=0; cin>>n; for(int i=0;i<n;i++) { cin>>score[i]; } for(i=0;i<n;i++) { if(score[i]>=60) jg++; if(score[i]>=85) yx++; } int jres=float((double)jg*100/n+0.5); int yres=float((double)yx*100/n+0.5); cout<<jres<<"%"<<endl; cout<<yres<<"%"<<endl; return 0; }
⛳7.回文日期
分析:需要判断输入的日期后续仍为正确日期数,需要分别判断年份的四位倒序能为正确的月日,注意
闰年
判断。日期为正期数时需要判断是否为回文日期,同时判断是否为ABABBABA
型回文。考虑获得回文日期时不再判断普通回文并记录该数,获得ABABBABA
型回文时不再判断并记录该数,两个获得后跳出循环.分两行输出两个日期。
#include <iostream> using namespace std; int months[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //判断日期是否合法 bool check(int date) { int year = date/10000; int month = date/100%100; int day = date%100; if(!month || month>13 || !day) return false; if(month != 2 && day > months[month]) return false; if(month == 2){ bool leap = year%4==0 && year%100 || year%400==0; if(day > 28+leap) return false; } return true; } //判断日期是否为回文日期 bool Ishuiwen(int date) { int temp = 0; while(date > temp){//求日期后四位的值 temp = temp * 10 + date%10; date /= 10; } if(date == temp) return true; return false; } //判断日期是否为ABABBABA型日期 bool IsABhuiwen(int date){ int d,m; d = date%100;//日期后两位78位 m = date/100%100;//日期后56位 if(Ishuiwen(date) && d==m) return true;//满足回文且56位=78时判断日期为ABABBABA型日期 return false; } int main() { int N; cin>>N; for(int i=N+1;i<=89991231;i++) if(check(i)&&Ishuiwen(i)) { cout<<i<<endl; break; } for(int j=N+1;j<=89991231;j++) if(check(j)&&IsABhuiwen(j)) { cout<<j<<endl; break; } return 0; }
⛳ 8.子串分值和
分析:逐一查找字符串的每个子集,将子集中重复的字符去掉再计算子集长度
#include<iostream> #include<cstring> #include<set> #include<algorithm> using namespace std; string s; int res; int cal(string s){ set<char> st; for(int i = 0; i < s.size(); i++){ st.insert(s[i]); } return st.size(); } int main(){ cin >> s; for(int i = 0; i < s.size(); i++){ for(int j = i; j < s.size(); j++){ string sub = s.substr(i, j - i + 1); res += cal(sub); } } cout << res; return 0; }
⛳9.平面切分
#include<iostream> #include<cstring> #include<set> using namespace std; set<pair<double,double> > se; const int N = 1005; double A[N]; double B[N]; set<pair<double,double> > s; set<pair<double,double> >::iterator it; int main() { int n,i,j,x,y; cin>>n; for(i=0;i<n;i++) { cin>>x>>y; s.insert(make_pair(x,y)); } n = s.size(); for(i=0,it=s.begin(),it++;it!=s.end();it++,i++) { A[i]=(*it).first; B[i]=(*it).second; } long long ans=2; for(i=1;i<n;i++) { set<pair<double,double> > se; for(j=i-1;j>=0;j--) { double x=(B[j]-B[i])/(A[i]-A[j]); double y=(A[j]*B[i]-A[i]*B[j])/(A[j]-A[i]); se.insert(make_pair(x,y)); } int n2=se.size(); ans+=(n2+1); } cout<<ans<<endl; }
⛳10.字串排序
分析:显然要使长度最短,我们就不能浪费每一个字母,所以,一定有字母是递减的顺序的,要使字典序最短,每个字母出现的数量一定是要递减的,这样就好了,限制一下每个字母最多出现的次数然后就是dfs dfsdfs爆搜,//Author : lifehappy的垫脚石
#include <bits/stdc++.h> using namespace std; const int N = 1e4 + 10; char ans[N], res[N]; int n, len; bool judge() { int i = len; while(ans[i] == res[i] && i) i--; return res[i] < ans[i]; } void dfs(int now, int maxn, int m, int sum) { if(sum == n) { if(m < len || (m == len && judge())) { len = m; for(int i = 1; i <= len; i++) ans[i] = res[i]; } return; } if(now >= 26) return ; for(int i = 1; i <= maxn; i++) { int temp = sum + m * i; if(temp > n) return ; res[m + i] = char(now + 'a'); dfs(now + 1, i, m + i, temp); } } int main() { len = 0x3f3f3f3f; scanf("%d", &n); dfs(0, 8, 0, 0); for(int i = len; i >= 1; i--) putchar(ans[i]); return 0; }