目录
A+B Problem
思路:
分两种情况:
1.除了最大的数 其他的都是与最大的数的和最大
2.最大的数与第二大的数的和最大
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int inf=LLONG_MAX/2;
void solve() {
int n;
cin>>n;
vector<int>a(n),b(n);
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b.begin(),b.end());
for(int i=0;i<n;i++){
if(a[i]!=b[n-1]){
a[i]+=b[n-1];
}else{
a[i]+=b[n-2];
}
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
// cin>>t;
while (t--){
solve();
}
return 0;
}
Komorebi的数学课
快速幂的典型板子题,define int long long
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int inf=LLONG_MAX/2;
int power(int a, int b,int p) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % p) {
if (b % 2) {
res = 1LL * res * a % p;
}
}
return res;
}
void solve() {
int n;
cin>>n;
int x=power(n,n,n+2);
cout<<x<<endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
// cin>>t;
while (t--){
solve();
}
return 0;
}
次佛锅
字符子串后面一定接的是数字字串,所以直接用一个map接收就好了。
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int inf=LLONG_MAX/2;
int power(int a, int b,int p) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % p) {
if (b % 2) {
res = 1LL * res * a % p;
}
}
return res;
}
void solve() {
int n;
string s;
getline(cin,s);
n=s.size();
int t;
cin>>t;
vector<string>q(t);
vector<int>len(t);
for(int i=0;i<t;i++){
cin>>q[i];
len[i]=q[i].size();
}
map<string,int>u;
string ss="",sz="";
s=" "+s;
s=s+" ";
n+=2;
for(int i=0;i<=n;i++){
if(s[i]==' '){
if(sz.size()!=0 and ss.size()!=0){
int x=stoi(ss);
u[sz]+=x;
sz="",ss="";
}
}if((s[i]>='a' and s[i]<='z') or (s[i]>='A' and s[i]<='Z')){
sz+=s[i];
}if(s[i]>='0' and s[i]<='9'){
ss+=s[i];
}
}
for(int i=0;i<t;i++){
cout<<u[q[i]]<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
// cin>>t;
while (t--){
solve();
}
return 0;
}
Setsuna的K数列
找规律 二进制
如果当前的数遍历二进制时此位置是1那么就然他加上 power(k,下标-1)。规律未知,真正的规律是保留计算各个位置上1的个数。
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int mod=1e9+7;
const int inf=LLONG_MAX/2;
int power(int a, int b,int p) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % p) {
if (b % 2) {
res = 1LL * res * a % p;
}
}
return res;
}
void solve() {
int n,k;
cin>>n>>k;
int ans=0;
for(int i=1;i<32;i++){
if(((n>>(i-1))&1)==1){
int x=power(k,i-1,mod);
x%=mod;
ans+=x;
ans%=mod;
}
}
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t--){
solve();
}
return 0;
}
黄金律法
两个分别从大到小 ,从小到大排序,输出乘法和就好。
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int inf=LLONG_MAX/2;
int power(int a, int b,int p) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % p) {
if (b % 2) {
res = 1LL * res * a % p;
}
}
return res;
}
void solve() {
int n;
cin>>n;
vector<int>w(n),m(n);
for(int i=0;i<n;i++){
cin>>w[i];
}
for(int i=0;i<n;i++){
cin>>m[i];
}
sort(w.begin(),w.end());
sort(m.begin(),m.end());
reverse(m.begin(),m.end());
int sum=0;
for(int i=0;i<n;i++){
sum+=w[i]*m[i];
}
cout<<sum<<endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
cin>>t;
while (t--){
solve();
}
return 0;
}
天气预报
可以理解,当一个子区间满足了,那么就把后面所有的数的个数都加在结果上,因为他们一定满足。反之扩大区间找满足就好了,若找到了,继续重复上一步。微调细节就好。
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e6+10;
const int inf=LLONG_MAX/2;
int power(int a, int b,int p) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % p) {
if (b % 2) {
res = 1LL * res * a % p;
}
}
return res;
}
void solve() {
int n,a,b;
cin>>n>>a>>b;
string s;
cin>>s;
int x=0,y=0;
int ans=0;
int i=0,j=0;
while(i<n){
while(j<n and (x<a or y<b)){
if(s[j]=='0'){
x++;
}else{
y++;
}
j++;
}
if(x>=a and y>=b){
ans+=n-j+1;
}
if(s[i]=='0'){
x--;
}else{
y--;
}
i++;
}
if(a==0 and b==0){
ans-=n-1;
cout<<ans<<endl;
return;
}
cout<<ans<<endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t--){
solve();
}
return 0;
}
史东薇尔城
板子的板子。
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
const int M=1e5 + 10;
const int N=2e5+10;
const int inf=LLONG_MAX/2;
struct node{
int x,w;
};
int n,m;
int vis[N],dist[N];
vector<node>g[N];
void solve() {
cin>>n>>m;
while(m--){
int x,y,w;
cin>>x>>y>>w;
g[x].push_back({y,w});
g[y].push_back({x,w});
}
for(int i=1;i<=n;i++){
dist[i]=inf;
}
dist[1]=0;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
q.push({0,1});
while(q.size()){
auto[fw,dian]=q.top();
q.pop();
if(vis[dian])
continue;
vis[dian]=1;
for(auto[x,w]:g[dian]){
if(dist[x]>w+fw){
dist[x]=w+fw;
q.push({dist[x],x});
}
}
}
int k;
cin>>k;
while(k--){
int c,d;
cin>>c>>d;
cout<<dist[c]+dist[d]<<endl;
}
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t--){
solve();
}
return 0;
}