week 14

文章包含多个C++代码片段,分别解决不同类型的序列问题,如最大和上升子序列、加一操作、跳跃游戏、异或和或、01序列、出栈序列判断、序列维护、网格判断和整齐的数组等,涉及动态规划、数学计算和栈操作等算法思想。
摘要由CSDN通过智能技术生成

最大和上升子序列

#include <bits/stdc++.h>

using namespace std;

int n;

const int maxn = 1e3 + 10;

long long dp[maxn];

int ori[maxn];

bool cmp(int a, int b) {

return a > b;

}

int main() {

dp[0] = 0;

cin >> n;

for (int i = 1; i <= n; i++) {

cin >> ori[i];

}

for (int i = 1; i <= n; i++) {

long long sum = ori[i];

for (int j = i - 1; j >= 0; j--) {

if (ori[i] > ori[j]) {

sum = max(ori[i] + dp[j], sum);

}

}

dp[i] = sum;

}

sort(dp, dp + n + 1, cmp);

cout << dp[0];

}

加一

#include <bits/stdc++.h>

using namespace std;

const long long mod = 1e9 + 7;

int main() {

// ios::sync_with_stdio(false);

// cin.tie(0);

// cout.tie(0);

int t;

scanf("%d",&t);

while (t--)

{

int n, m;

scanf("%d%d",&n,&m);

int num[10] = { 0 };

while (n > 0)

{

num[n % 10]++;

n /= 10;

}

while (m > 0)

{

for (int i = 9; i >= 0;) {

m--;

if(m==-1)break;

if (num[i] > 0) {

num[i+1 > 9 ? 0 : i+1] = (num[i]+num[i+1 > 9 ? 0 : i+1])%mod;

//这一段再优化一下就成了外层转m遍历,内层不断从0到9转加等于

}

i=(i==0?9:i-1);

}

}

long long sum = 0;

for (int i = 0; i < 10; i++) {

sum = (num[i] + sum) % mod;

}

printf("%d\n",sum);

}

}

跳跳

#include<bits/stdc++.h>

#define ll long long

using namespace std;

ll maxyue(ll a,ll b){

if(a<0)a=-a;

if(b<0)b=-b;

if(a==1||b==1)return 1;

while(1){

ll t=a%b;

if(t==0){

break;

}else{

a=b;

b=t;

}

}

return b;

}

long long ori[510][2];

int main(){

int n;

cin>>n;

for(int i=0;i<n;i++){

cin>>ori[i][0]>>ori[i][1];

}

map<ll,map<ll,int>>tu;

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

if(j==i)continue;

ll x=ori[j][0]-ori[i][0];

ll y=ori[j][1]-ori[i][1];

ll yue=maxyue(x, y);

x/=yue;

y/=yue;

tu[x][y]=1;

}

}

int sum=0;

for(map<ll,map<ll,int>>::iterator it=tu.begin();it!=tu.end();it++){

sum+=tu[it->first].size();

}

cout<<sum;

}

异或和或

#include<bits/stdc++.h>

#define ll long long

using namespace std;

int main(){

int t;

cin>>t;

while (t--)

{

string a,b;

cin>>a>>b;

if(a.length()!=b.length()){

cout<<"NO"<<endl;

}else{

int a_0=0,a_1=0;

int b_0=0,b_1=0;

for(int i=0;i<a.length();i++){

if(a[i]=='1'){a_1++;}

else a_0++;

}

for(int i=0;i<b.length();i++){

if(b[i]=='1'){b_1++;}

else b_0++;

}

if(a_1==0&&b_1>0){

cout<<"NO"<<endl;

}else if(a_1>0&&b_1==0){

cout<<"NO"<<endl;

}

else{

cout<<"YES"<<endl;

}

}

}

}

01序列

#include <bits/stdc++.h>

# define ll long long

using namespace std;

const int maxn=1e6+10;

ll dp[maxn];

int qianzhui[maxn];

map<int,ll>qian_map;

int main() {

int k;

cin >> k;

string a;

cin >> a;

if(k==0){

dp[0]=0;

for(int i=1;i<maxn;i++){

dp[i]=dp[i-1]+i;

}

int len_0=0;

ll ans=0;

for(int i=0;i<a.length();i++){

if(a[i]=='1'){

ans+=dp[len_0];

len_0=0;

}else{

len_0++;

}

}

ans+=dp[len_0];

cout<<ans;

}else{

qian_map[0]++;

for (int i = 0; i < a.length(); i++) {

qianzhui[i+1]=qianzhui[i]+(a[i]-'0');

qian_map[qianzhui[i+1]]++;

}

int ans=0;

int start=0;

while(qian_map[start+k] !=0){

ans+=qian_map[start]*qian_map[start+k];

start++;

}

cout << ans;

}

}

出栈序列判断

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 10;

int ori[maxn];

int n;

int again[maxn] = { 0 };

int main() {

// ios::sync_with_stdio(false);

// cin.tie(0);

// cout.tie(0);

scanf("%d", &n);

for (int i = 0; i < n; i++) {

scanf("%d", &ori[i]);

}

stack<int> mystack;

mystack.push(0);

again[0] = 1;

for (int i = 0; i < n; i++) {

int top = mystack.top();

for (int j = top; j < ori[i]; j++) {

if (again[j] == 0) {

mystack.push(j);

printf("push %d\n", j);

again[j] = 1;

}

}

if (again[ori[i]] == 0)printf("push %d\n", ori[i]);

again[ori[i]] = 1;

printf("pop\n");

}

}

序列维护

#define _CRT_SECURE_NO_WARNINGS

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e3 + 10;

struct node

{

long long num;

int next;

};

node biao[maxn];

int main() {

int m;

scanf("%d", &m);

biao[0].next = 0;

int num_biao = 0;

while (m--)

{

char temp[10];

scanf("%s", &temp);

if (!strcmp(temp,"insert")) {

int x;

long long y;

num_biao++;

scanf("%d%lld", &x,&y);

int num = 0;

if (x == 0) {

biao[num_biao].num = y;

biao[num_biao].next = biao[0].next;

biao[0].next = num_biao;

}

else {

for (int i = biao[0].next; i; i = biao[i].next) {

num++;

if (num == x) {

biao[num_biao].num = y;

biao[num_biao].next = biao[i].next;

biao[i].next = num_biao;

break;

}

}

}

}

else if(!strcmp(temp,"query")){

int k;

scanf("%d", &k);

int num = 0;

for (int i = biao[0].next; i; i = biao[i].next) {

num++;

if (num == k) {

printf("%d\n", biao[i].num);

break;

}

}

}

else {

int x;

scanf("%d", &x);

int num = 0;

int last = 0;

for (int i = biao[0].next; i; i = biao[i].next) {

num++;

if (num == x) {

biao[last].next = biao[i].next;

break;

}

last = i;

}

}

}

}

网格判断

#include<bits/stdc++.h>

using namespace std;

int n;

int mymap[25][25];

int main(){

cin>>n;

for(int i=0;i<n;i++){

for(int j=0;j<n;j++){

char temp;

cin>>temp;

if(temp=='W'){

mymap[i][j]=0;

}else{

mymap[i][j]=1;

}

}

}

int mymap1[25][25];

for(int i=0;i<n;i++){

int num_b=0;

int maxlen=0;

int len=1;

int last;

for(int j=0;j<n;j++){

mymap1[i][j]=mymap[j][i];

num_b+=mymap[i][j];

if(j!=0){

//last=mymap[i][j];

if(last==mymap[i][j]){

len++;

}else{

maxlen=max(maxlen,len);

len=1;

}

}

last=mymap[i][j];

}

if(num_b!=n/2||maxlen>=3){

cout<<0<<endl;

return 0;

}

}

for(int i=0;i<n;i++){

int num_b=0;

int maxlen=0;

int len=1;

int last;

for(int j=0;j<n;j++){

num_b+=mymap1[i][j];

if(j!=0){

if(last==mymap1[i][j]){

len++;

}else{

maxlen=max(maxlen,len);

len=1;

}

}

last=mymap1[i][j];

}

if(num_b!=n/2||maxlen>=3){

cout<<0<<endl;

return 0;

}

}

cout<<1<<endl;

return 0;

}

整齐的数组

#include<bits/stdc++.h>

using namespace std;

int gongyue(int a, int b) {

while (1)

{

int t = a % b;

if (t == 0) {

break;

}

else {

a = b;

b = t;

}

}

return b;

}

int main() {

int t;

cin >> t;

while (t--) {

int n;

cin >> n;

int ori[50];

for (int i = 0; i < n; i++) {

cin >> ori[i];

}

sort(ori, ori + n);

int cha[50];

int num_cha = 0;

bool deng = 1;

int last = 0;

for (int i = 0; i < n; i++) {

if (ori[i] != ori[i - 1 > 0 ? i - 1 : 0])deng = 0;

if (last == ori[i] - ori[0])continue;

cha[num_cha] = ori[i] - ori[0];

last = cha[num_cha++];

}

if (deng) {

cout << -1 << endl;

}

else {

int maxn = cha[0];

for (int i = 1; i < num_cha; i++) {

if (cha[i] % maxn != 0) {

maxn = gongyue(maxn, cha[i]);

}

}

cout << maxn << endl;

}

}

}

删删

#include<bits/stdc++.h>

using namespace std;

char zimu[26];

int main() {

int t;

zimu[0] = 'a';

for (int i = 1; i < 26; i++) {

zimu[i] = zimu[i - 1] + 1;

}

cin >> t;

while (t--)

{

int n; string a;

cin >> n >> a;

int maxnum = n;

bool yes = 1;

bool youjie=0;

for (int i = 0; i < 26; i++) {

int l = 0, r = n-1;

int num=0;

yes = 1;

while (l < r) {

if (a[l] != a[r]) {

if (a[l] == zimu[i]) {

l++;

num++;

continue;

}

else if (a[r] == zimu[i])

{

r--;

num++;

continue;

}

else {

yes = 0;

break;

}

}

l++;

r--;

}

if (yes) {

youjie=1;

maxnum=min(maxnum,num);

}

}

if (youjie==0) {

cout << -1 << endl;

}else{

cout<<maxnum<<endl;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值