#include<iostream>usingnamespace std;longlong n, a, b;longlongfun(){if(n <=2){returnmin(a, b);}longlong ret =0;if(3* a >2* b){int tmp = n /3;
ret += b * tmp;
n %=3;if(n ==1){
ret +=min(min(a, b),2* a - b);}if(n ==2){
ret +=min(min(a, b),3* a - b);}}else{int tmp = n /2;
ret += a * tmp;
n %=2;if(n){
ret +=min(min(a, b), b - a);}}return ret;}intmain(){int t =0;
cin >> t;while(t--){
cin >> n >> a >> b;
cout <<fun()<< endl;}return0;}
1.3 数位染色(动态规划 - 01背包)
题目链接: DP59 数位染色
题目描述:
解法:
算法思路:01 背包应用题~
C++ 算法代码:
#include<iostream>usingnamespace std;constint N =20, M = N *9;longlong x;int n =0, sum =0;// 这个数有多少位int arr[N]={0};bool dp[M]={false};boolfun(){if(sum %2==1){returnfalse;}
dp[0]=true;
sum /=2;for(int i =0; i < n; i++){for(int j = sum; j >= arr[i]; j--){
dp[j]= dp[j]|| dp[j - arr[i]];}}return dp[sum];}intmain(){
cin >> x;while(x){
arr[n++]= x %10;
sum += x %10;
x /=10;}if(fun()){
cout <<"Yes"<< endl;}else{
cout <<"No"<< endl;}return0;}
2. Day32
2.1 素数回文(模拟 + 数学)
题目链接: BC157 素数回文
题目描述:
解法:
算法思路:模拟题,注意数据范围~
C++ 算法代码:
#include<iostream>#include<cmath>usingnamespace std;longlongchange(string& s){for(int i = s.size()-2; i >=0; i--){
s += s[i];}returnstol(s);}boolisprime(longlong x){if(x <=1){returnfalse;}for(int i =2; i <sqrt(x); i++){if(x % i ==0){returnfalse;}}returntrue;}intmain(){
string s;
cin >> s;longlong x =change(s);if(isprime(x)){
cout <<"prime"<< endl;}else{
cout <<"noprime"<< endl;}return0;}
#include<iostream>#include<algorithm>usingnamespace std;constint N =2e5+10;intmain(){int n =0;
cin >> n;
pair<int,int> arr[N];for(int i =0; i < n; i++){
cin >> arr[i].first >> arr[i].second;}sort(arr, arr + n);int ret =1;int cur = arr[0].second;for(int i =1; i < n; i++){if(arr[i].first >= cur){
ret++;
cur = arr[i].second;}else{
cur =min(cur, arr[i].second);}}
cout << ret << endl;return0;}
// 第一种使用容器#include<iostream>#include<unordered_map>usingnamespace std;intmain(){
string s;
cin >> s;int n = s.size();int left =0;int right =0;int ret =0;
unordered_map<char,int> hash;while(right < n){
hash[s[right]]++;while(hash.size()>=3){if(--hash[s[left]]==0){
hash.erase(s[left]);}
left++;}
ret =max(ret, right - left +1);
right++;}
cout << ret << endl;return0;}// 第二种不用容器#include<iostream>usingnamespace std;intmain(){
string s;
cin >> s;int n = s.size();int left =0;int right =0;int ret =0;int hash[26]={0};// 统计窗⼝内每种字符出现了多少次int count =0;// 统计窗⼝内⼀共有多少种字符while(right < n){if(hash[s[right]-'a']++==0)// 0->1, 窗⼝内多了⼀种字符{
count++;}if(count >2){if(hash[s[left++]-'a']--==1)// 1->0, 窗⼝内少了⼀种字符{
count--;}}
ret =max(ret, right - left +1);
right++;}
cout << ret << endl;return0;}
#include<iostream>usingnamespace std;intmain(){
string s;
cin >> s;int n = s.size();int sum =0;int count =1;for(int i =0; i < n -1; i++){if(s[i]>='0'&& s[i]<='9'){
sum +=(s[i]-'0')* count;
count++;}}
sum %=11;if(sum == s[n -1]-'0'||(sum ==10&& s[n -1]=='X')){
cout <<"Right"<< endl;}else{
s[n -1]= sum ==10?'X': sum +'0';
cout << s << endl;}return0;}
#include<iostream>#include<queue>#include<cstring>usingnamespace std;constint N =35;int x1, y1;// 标记起点位置int n, m;char arr[N][N];int dist[N][N];
queue<pair<int,int>> q;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};voidbfs(){memset(dist,-1,sizeof dist);
dist[x1][y1]=0;
q.push({x1, y1});while(q.size()){auto[a, b]= q.front();
q.pop();for(int i =0; i <4; i++){int x = a + dx[i];int y = b + dy[i];if(x >=1&& x <= n && y >=1&& y <= m && dist[x][y]==-1&& arr[x][y]!='*'){
dist[x][y]= dist[a][b]+1;if(arr[x][y]!='e'){
q.push(make_pair(x, y));}}}}}intmain(){
cin >> n >> m;for(int i =1; i <= n; i++){for(int j =1; j <= m; j++){
cin >> arr[i][j];if(arr[i][j]=='k'){
x1 = i;
y1 = j;}}}bfs();int count =0;int ret =1e9;for(int i =1; i <= n; i++){for(int j =1; j <= m; j++){if(arr[i][j]=='e'&& dist[i][j]!=-1){
count++;
ret =min(ret, dist[i][j]);}}}if(count ==0){
cout <<-1<< endl;}else{
cout << count <<" "<< ret << endl;}return0;}
classSolution{public:int m, n;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int memo[1010][1010];intdfs(vector<vector<int>>& matrix,int i,int j){if(memo[i][j]!=-1){return memo[i][j];}int len =1;for(int k =0; k <4; k++){int x = i + dx[k];int y = j + dy[k];if(x >=0&& x < n && y >=0&& y < m && matrix[x][y]> matrix[i][j]){
len =max(len,dfs(matrix, x, y)+1);}}
memo[i][j]= len;return len;}intsolve(vector<vector<int>>& matrix){
n = matrix.size();
m = matrix[0].size();memset(memo,-1,sizeof memo);int ret =1;for(int i =0; i < m; i++){for(int j =0; j < n; j++){
ret =max(ret,dfs(matrix, i, j));}}return ret;}};
#include<iostream>usingnamespace std;constint N =1e5+10;int n;char s[N];longlong f[26];longlong g[26];intmain(){
cin >> n >> s;longlong ret =0;for(int i =0; i < n; i++){int x = s[i]-'a';
ret += f[x];
f[x]= f[x]+ i - g[x];
g[x]= g[x]+1;}
cout << ret << endl;return0;}