1、数位统计✔
统计每位1出现的次数,再遍历每一位就行了。
对于每一位的计算,根据0,1,>1三种情况分别计算。
可参考《算法基础课》数位统计DP的思路,这题只是那题的特例
1049 Counting Ones
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N =40;
int main(){
int x;cin>>x;
vector<int> c;
while(x){
c.push_back(x%10);
x/=10;
}
reverse(c.begin(),c.end());
int ans=0;
for(int i=0;i<c.size();i++){
int abc=0,efg=0;
for(int j=0;j<i;j++) abc = abc*10+c[j];
for(int j=i+1;j<c.size();j++) efg = efg *10 +c[j];
if(c[i]==0){
ans += abc * pow(10,c.size()-i-1);
}
else if(c[i]==1){
ans += abc * pow(10,c.size()-i-1) + efg+1;
}
else if(c[i]>1){
ans += (abc+1) * pow(10,c.size()-i-1);
}
}
cout<<ans<<endl;
return 0;
}
2、质因素分解✔
可以参考y总的方式,就不用map额外存储了。
测试点3如果N=1,输出1=1;
1059 Prime Factors #质因素分解
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int a[2];
int main(){
map<long long,int> m;
long long x;cin>>x;
cout<<x<<"=";
if (x==1) {
cout<<x<<endl;
return 0;
}
long long i=2;
while(x!=1){
if(x%i==0){
m[i]+=1;
x/=i;
}
else i++;
}
bool first = true;
for(auto &v:m){
if(first){
cout<<v.first;
first =false;
}
else cout<<"*"<<v.first;
if(v.second>1) cout<<"^"<<v.second;
}
cout<<endl;
}
3、分数相加
1081 Rational Sum #最大公约数
4、分数运算
1088 Rational Arithmetic #最大公约数
5、连续的因子✔
先求出全部因子,再枚举起始位置。判断是否满足条件进行延申长度。
1096 Consecutive Factors
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int x;cin>>x;
vector<int> v;
for(int i=2;i<=x/i;i++){
if(x%i==0){
v.push_back(i);
if(i*i!=x) v.push_back(x/i);
}
}
v.push_back(x);
sort(v.begin(),v.end());
// for(auto &vv:v){
// cout<<vv<<" ";
// }
int n=v.size();
int max=0,pos;
for(int k=0;k<n;k++){ //从k开始
int ans=v[k];
int cnt=1;
for(int i=k+1;i<n;i++){
if(v[i]==v[i-1]+1 && x%(ans*v[i])==0 && ans*v[i]<=x){
ans*=v[i];
cnt++;
}
else break;
}
if(cnt>max){
max=cnt;
pos = k;
}
}
cout<<max<<endl;
cout<<v[pos];
for(int i=pos+1;i<pos+max;i++){
cout<<"*"<<v[i];
}
cout<<endl;
}
6、整数分解✔
二维背包问题;完全背包;求具体方案;和最大;
为满足和最大,不能单纯使用0,1判别,用-0x3f表示不存在,>0的值表示所有方案中取和最大;
1103 Integer Factorization #背包问题
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
const int N = 410;
int f[21][N][N];
int main(){
int n,k,p;
cin>>n>>k>>p;
memset(f,-0x3f,sizeof f);
for(int m=1;m<=21;m++) f[m][0][0]=0;
int m=1;
for(;;m++){
int v = pow(m,p);
if(v>n) break;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
f[m][i][j] = f[m-1][i][j];
if(i>=v && j>0) f[m][i][j] = max(f[m][i][j],f[m][i-v][j-1]+m);
}
}
}m--;
// for(int i =2 ;i<=m;i++)
// cout<<i<<" " <<f[i][n][k]<<endl;
// for(int i =2 ;i<=n;i++)
// cout<<i<<" " <<f[2][i][k]<<endl;
if(f[m][n][k] <0 ) cout<<"Impossible"<<endl;
else{
cout<<n<<" = ";
bool first=true;
int i=n,j=k;
while(f[m][i][j]>=0){
int v = pow(m,p);
if(f[m][i-v][j-1]+m >= f[m][i][j] ){
if(first) cout<<m<<"^"<<p,first=false;
else cout<<" + "<<m<<"^"<<p;
i = i-v;
j = j-1;
}
else{
m--;
}
}
cout<<endl;
}
return 0;
}
7、数段之和✔
找规律+long double+print(“%.2Lf”);
1104 Sum of Number Segments
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int main(){
int n;cin>>n;
long double sum=0;
for(int i=1;i<=n;i++){
double x;
cin>>x;
sum+=x*(i)*(n+1-i) ;
}
printf("%.2Lf\n",sum);
}
8、卡住的键盘✔
#include<iostream>
#include<cstring>
#include<unordered_set>
using namespace std;
const int N = 110;
int main(){
int n;
cin>>n;
string s;
cin>>s;
unordered_set<char> set;
int k=1;
for(int i=1;i<s.size();i++){
if(s[i]==s[i-1]){
k++;
}
else {
if(k%n!=0) set.insert(s[i-1]);
k=1;
}
}
if(k%n!=0) set.insert(s[s.size()-1]);
string ans="";
unordered_set<char> set2;
for(int i=0;i<s.size();i++){
ans += s.substr(i,1);
if(!set.count(s[i]) ) {
if(!set2.count(s[i])) cout<<s[i];
set2.insert(s[i]);
i+=n-1;
}
}
cout<<endl;
cout<<ans<<endl;
}
9、质数判断✔
根据排名输出。
1116 Come on! Let’s C
#include<iostream>
#include<cstring>
#include<unordered_map>
using namespace std;
bool isprime(int x){
for(int i=2;i<=x/i;i++){
if(x%i==0) return false;
}
return true;
}
int main(){
int n;cin>>n;
unordered_map<string,string> map;
string id;cin>>id;
map[id] = "Mystery Award";
for(int i=2;i<=n;i++){
cin>>id;
if(isprime(i)) map[id] = "Minion";
else map[id] = "Chocolate";
}
unordered_map<string,int> visited;
int k;cin>>k;
while(k--){
cin>>id;
if(!map.count(id)) cout<<id<<": Are you kidding?"<<endl;
else {
cout<<id<<": ";
if(visited.count(id)) cout<<"Checked"<<endl;
else cout<<map[id]<<endl;
visited[id]=1;
}
}
}
10、质数判断✔
连续字符串中找长度为k的质数。
1152 Google Recruitment
#include<iostream>
#include<cstring>
using namespace std;
bool isprime(int x){
for(int i=2;i<=x/i;i++){
if(x%i==0) return false;
}
return true;
}
int main(){
int l,k;
cin>>l>>k;
string s;
cin>>s;
for(int i=0;i<s.size()-k+1;i++){
string a = s.substr(i,k);
if(isprime(stoi(a))) {
cout<<a<<endl;
return 0;
}
}
cout<<404<<endl;
}
#进位制
…
进制
1482 1010. Radix
1492 1015. Reversible Primes
1504 1027. Colors in Mars
1590 1100. Mars Numbers
1231 1019. General Palindromic Number