最大和上升子序列
#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;
}
}
}