AcWing3511
输入样例:
0 5 5
2 2 4
输出样例:
2
3
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int A,B,C;
unordered_set <int> Cval;
set<pair<int,int>> ab;
void dfs(int a,int b,int c){
if(ab.count({a,b}))
return;
ab.insert({a,b});
Cval.insert(c);
if(a != 0){
if(a+b <= B)
dfs(0,a+b,c);
else
dfs(a-(B-b),B,c);
if(a+c <= C)
dfs(0,b,a+c);
else
dfs(a-(C-c),b,C);
}
if(b != 0){
if(b+a <= A)
dfs(a+b,0,c);
else
dfs(A,b-(A-a),c);
if(b+c <= C)
dfs(a,0,b+c);
else
dfs(a,b-(C-c),C);
}
if(c != 0){
if(c+a <= A)
dfs(a+c,b,0);
else
dfs(A,b,c-(A-a));
if(c+b <= B)
dfs(a,b+c,0);
else
dfs(a,B,c-(B-b));
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
while (cin>>A>>B>>C) {
dfs(0,0,C);
cout<<Cval.size()<<endl;
Cval.clear();
ab.clear();
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll B = 10000;
int C[3];
unordered_set <ll> states;
unordered_set <int> cs;
void pour(int c[],int i,int j){
int t = min(c[i],C[j]-c[j]);
c[i] -= t,c[j] += t;
}
ll get(int c[])
{
return c[2]*B*B+c[1]*B+c[0];
}
void dfs(int c[]){
states.insert(get(c));
cs.insert(c[2]);
int a[3];
for(int i = 0; i < 3;i++)
for(int j = 0;j < 3;j++){
if(i != j){
memcpy(a,c,sizeof a);
pour(a,i,j);
if(!states.count(get(a)))
dfs(a);
}
}
}
int main()
{
while(cin>>C[0]>>C[1]>>C[2]){
states.clear();
cs.clear();
int c[3] = {0,0,C[2]};
dfs(c);
cout<<cs.size()<<endl;
}
return 0;
}
AcWing3537
输入样例:
4
1 2 3 4
2
输出样例:
2 3
#include <bits/stdc++.h>
using namespace std;
const int N = 2070;
int n,k;
int a[N];
int level[N];
queue<int> q;
void bfs(){
q.push(1);
level[1] = 1;
while(q.size()){
int t = q.front();
q.pop();
if(a[2*t]) q.push(2*t),level[2*t] = level[t]+1;
if(a[2*t+1])q.push(2*t+1),level[2*t+1] = level[t]+1;
}
}
int main()
{
cin>>n;
for(int i = 1;i <= n;i++)
cin>>a[i];
cin>>k;
bfs();
bool flag = false;
for(int i = 1;i <= n;i++)
if(level[i] == k)
cout<< a[i] << " ",flag = true;
if(!flag)
cout<<"EMPTY";
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n,k;
int w[N];
int main()
{
cin>>n;
for(int i = 0; i < n;i++) cin>>w[i];
cin>>k;
int start = (1 << k-1) -1,end = start+(1 << k - 1);
for(int i = start; i < end && i < n;i++)
cout<< w[i] << ' ';
if(start >= n)
cout<<"EMPTY";
}
START = 1
AcWing4485
输入样例1:
5
1 2 3 4 5
2 1 4 3 5
输出样例1:
Yes
输入样例2:
5
1 1 1 1 1
1 0 1 0 1
输出样例2:
Yes
输入样例3:
3
2 3 9
1 7 9
输出样例3:
No
#include <iostream>
using namespace std;
const int N = 1010;
int main()
{
int a[N],b[N];
int n;cin>>n;
cin>>a[0];
for (int i = 1;i < n;i++) {
cin>>a[i];
a[i] += a[i-1];
}
cin>>b[0];
for (int i = 1;i < n;i++) {
cin>>b[i];
b[i] += b[i-1];
}
if( a[n-1] >= b[n-1] ){
cout<<"Yes";
}else {
cout<<"No";
}
return 0;
}
前缀和第一步
ACWING4486
输入样例1:
20
输出样例1:
10 2
输入样例2:
5184
输出样例2:
6 4
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;cin>>n;
int res = 1,m = 0;
vector <int> a;
for (int i = 2;i*i <= n;i++) {
if(n % i == 0){
int c = 0;
while (n % i == 0)
n /= i,c++;
res *= i;
a.push_back(c);
while (1<< m < c) {
m++;
}
}
}
if(n > 1){
res *= n;
a.push_back(1);
while (1<< m < 1) {
m++;
}
}
for(auto x: a){
if(x< 1 << m){
m++;
break;
}
}
cout<<res<< ' '<< m <<endl;
return 0;
}
ACWING4487
输入样例1:
5
100 200 1 1 1
输出样例1:
3
输入样例2:
5
1 2 3 4 5
输出样例2:
0
输入样例3:
2
101 99
输出样例3:
1
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1000010;
int n;
LL s[N];
int stk[N];
int main()
{
cin>>n;
for(int i = 1 ; i <= n; i++){
int x;
cin>>x;
s[i] = s[i-1] + x - 100;
}
int top = 0,res = 0;
stk[ ++ top] = 0;
for(int i = 1; i <= n;i++){
if(s[stk[top]] > s[i])
stk[++ top] = i;
else if(s[stk[top]] < s[i]){
int l = 1,r = top;
while(l < r){
int mid = l + r >> 1;
if(s[stk[mid]] < s[i])
r = mid;
else
l = mid+1;
}
res = max(res,i-stk[r]);
}
}
cout<<res;
}
ACWING3564
输入样例:
2
1999 10 20
2001 1 31
输出样例:
1999-10-21
2001-02-01
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;cin>>t;
while (t--) {
int y,m,d;
cin>>y>>m>>d;
if(m == 12&&d == 31){
y++, m = 1, d = 1;
}
if (day[m-1] < d+1) {
m++,d = 1;
}else {
d++;
}
printf("%04d-%02d-%02d\n", y, m, d);
}
return 0;
}
ACWING3625
输入样例:
2 5
输出样例:
32
快速幂
快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。
让我们先来看一个简单的例子:
3^10=3*3*3*3*3*3*3*3*3*3
3^10=(3*3)*(3*3)*(3*3)*(3*3)*(3*3)
310=(3*3)5
310=95
95=(94)*(91)
95=(65611)*(91)
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
using namespace std;
#define MOD 233333
ll quickPOW(ll x,ll n){
if(n == 0)
return 1;
ll res = quickPOW(x,n>>1);
res = res*res % MOD;
//n&1的作用是判断n(二进制)的最后一位是不是1, 即快速判断是否是奇数
//奇数除以2会小一个单位, 所以还要再乘以一个x
if(n & 1)
res = res*x%MOD;
return res;
}
int main()
{
ll x,n;cin>>x>>n;
cout<<quickPOW(x,n);
return 0;
}
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
using namespace std;
#define MOD 233333
typedef long long LL;
int qmi(int a,int b,int p){
int res = 1;
while(b){
if(b&1)
res = (LL) res*a % p;
a = (LL) a*a%p;
b >>= 1;
}
return res;
}
int main()
{
int a,b,p = 233333;
cin>>a>>b;
cout<<qmi(a,b,p);
return 0;
}
ACWING3587
输入样例:
4 3
1 2
2 3
3 2
3 2
1 2
2 3
输出样例:
NO
YES
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 5005;
int h[N],e[N*2],ne[N*2],idx;
bool st[N];
void add(int a,int b){
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
void dfs(int u){
st[u] = 1;
for(int i = h[u];i != -1;i = ne[i]){
int j = e[i];
if(!st[j])
dfs(j);
}
}
int main()
{
int n,m,flag;
int x,y;
while(cin>>n>>m){
idx = 0,flag = 0;
memset(h,-1,sizeof h);
memset(st, 0, sizeof st);
while (m--) {
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
dfs(1);
for(int i = 1; i <= n;i++)
if(!st[i]){
flag = 1;
break;
}
if(flag == 0)
cout<<"YES"<<endl;
else {
cout<<"NO"<<endl;
}
}
return 0;
}
并查集
const int N = 1010;
int n,m;
int p[N];
int find(int x){
if(p[x] != x)
p[x] = find(p[x]);
return p[x];
}
int main()
{
while(cin>>n>>m){
for(int i = 1;i <= n;i++)
p[i] = i;
while(m--){
int a,b;
cin>>a>>b;
p[find(a)] = find(b);
}
bool res = true;
for(int i = 2;i <= n;i++){
if(find(i) != find(1)){
res = false;
break;
}
}
if(res)
cout<<"YES";
else
cout<<"NO";
}
}
ACWING3381
输入样例:
bob
www
输出样例:
7
7
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
string s[8] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
typedef pair <int,int> PII;
map<char, PII> keyboard;
int main()
{
for(int i = 0;i < 8;i++)
for(int j = 0;j < s[i].size();j++)
keyboard[s[i][j]] = {i,j+1};
string str;
while (cin>>str) {
int cnt = 0;
char a = str[0],b;
cnt += keyboard[a].second;
for(int i = 1;i < str.size();i++){
b = str[i];
if(keyboard[b].first == keyboard[a].first){
cnt += 2;
}
cnt += keyboard[b].second;
a = b;
}
cout<<cnt<<endl;
}
}
ACWING3598
输入样例:
ABC
BAC
FDXEAG
XDEFAG
输出样例:
BCA
XEDGAF
#include <iostream>
using namespace std;
struct TreeNode{
char val;
TreeNode *left;
TreeNode *right;
TreeNode():val('a'),left(nullptr),right(nullptr){}
TreeNode(char val):val(val),left(nullptr),right(nullptr){}
TreeNode(char val,TreeNode *left,TreeNode *right):val(val),left(left),right(right){}
};
TreeNode * travers(string pre,int preStart,int preEnd,
string in,int inStart,int inEnd){
if(preStart > preEnd){
return nullptr;
}
char rootVal = pre[preStart];
char index = 0;
for(int i = inStart;i <= inEnd;i++){
if(in[i] == rootVal){
index = i;
break;
}
}
int leftSize = index - inStart;
TreeNode *root = new TreeNode(rootVal);
root->left = travers(pre,preStart+1,preStart+leftSize,
in,inStart,index-1);
root->right = travers(pre,preStart+leftSize+1,preEnd,
in,index+1,inEnd);
return root;
}
void print(TreeNode *root){
if(!root)
return;
print(root->left);
print(root->right);
cout<<root->val;
}
int main()
{
string pre,in;
while (cin>>pre>>in) {
TreeNode *root = travers(pre,0,pre.size()-1,
in,0,in.size()-1);
print(root);
cout<<endl;
}
return 0;
}