Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]相关的知识,希望对你有一定的参考价值。

1523 非回文

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注

一个字符串是非回文的,当且仅当,他只由前p个小写字母构成,而且他不包含长度大于等于2的回文子串。

给出长度为n的非回文串s。请找出字典序比s大的,而且字典序要最小的长度为n的非回文。

Input
单组测试数据。
第一行有两个整数n 和p (1≤n≤1000; 1≤p≤26)。
第二行包含一个字符串s,它的长度是n。输入保证他是非回文的。
Output
输出字典序比s大的且字典序要最小的长度为n的非回文,如果不存在输出NO。
Input示例
样例输入1
3 3
cba
样例输入2
3 4
cba
Output示例
样例输出1
NO
样例输出2
cbd

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <stack>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> Pii;
const int inf = 0x3f3f3f3f;
const LL INF = 1LL<<60;
const int mod = 1000000007;
const int N = 1e5+5;
const double Pi = acos(-1.0);
char s[1005];
int n,p;
bool solve(int cur , bool flag){
    if(cur==n)return 1;
    char fix;
    if(flag){
        fix = \'a\';
    }
    else {
        fix = s[cur];
        if(cur==n-1)fix++;
    }
    for(;fix < p;fix++){
        if((cur > 0&&fix == s[cur - 1]) || (cur > 1&&fix == s[cur - 2]))continue;
        if(fix > s[cur])flag=true;
        s[cur] = fix;
        if(solve(cur + 1,flag))return true;
    }
    return false;
}
int main() {
#ifdef local
    freopen("in", "r", stdin);
#endif
    cin>>n>>p;
    p+=\'a\';
    cin>>s;
    if(solve(0,false)){
        cout<<s<<endl;
    }
    else cout<<"NO"<<endl;
}
View Code

1655 染色问题

基准时间限制:1 秒 空间限制:10240 KB 分值: 40 难度:4级算法题
收藏
关注
一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n),最终使得所有三个点构成的环(C(n,3)个不同的换)上三条边的颜色和在所有颜色中任选三种颜色的组合(C(n,3)种方案)一一对应,由你来给出染色方案。
本题有多组数据
Input
第一行一个整数T,表示数据组数
接下来T行每行一个整数n,表示完全图的点数
Output
输出由T个部分组成
每个部分的第一行一个整数n,表示完全图的点数
第二行表示构造结果
如果无解输出No solution
否则输出n*(n-1)/2条边的起点、终点和颜色
Input示例
2
4
3
Output示例
4
No solution
3
1 2 3 2 3 1 3 1 2
 

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <stack>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define mp make_pair
typedef long long LL;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
const LL INF = 1LL<<60;
const int mod = 1000000007;
const int N = 32000;
int main() {
#ifdef local
    freopen("in", "r", stdin);
#endif
    int T;
    cin>>T;
    while(T--){
        int n ;
        cin>>n;
        printf("%d\\n",n);
        if(n&1){
            for(int i = 1; i < n ; i++){
                for(int j = i + 1; j <= n ; j++){
                    printf("%d %d %d ",i,j,(i+j-3)%n+1);
                }
            }
        }
        else printf("No solution");
        puts("");
    }
}
View Code

1674 区间的价值 V2

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
lyk拥有一个区间。
它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积。
例如3个数2,3,6。它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2*7=14。
现在lyk有一个n个数的序列,它想知道所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果是多少。
例如当这个序列为{3,4,5}时,那么区间[1,1],[1,2],[1,3],[2,2],[2,3],[3,3]的贡献分别为9,0,0,16,20,25。
Input
第一行一个数n(1<=n<=100000)。
接下来一行n个数ai,表示这n个数(0<=ai<=10^9)。
Output
一行表示答案。
Input示例
3
3 4 5
Output示例
70


#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <stack>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> Pii;
const int inf = 0x3f3f3f3f;
const LL INF = 1LL<<60;
const int mod = 1000000007;
const int N = 1e5+5;
const double Pi = acos(-1.0);
const int maxn = 1e5+5;
int n ;
int a[maxn];
int Or[155],And[155];
int ans[155];
LL res = 0;
void cnt(int l , int r){
    int mid = (l + r) >> 1;
    int s = 0 ;
    Or[s] = And[s] = a[mid];
    ans[s] = 1;
    for(int i = mid + 1; i <= r; i++){
        if( ( (Or[s]|a[i]) == Or[s] ) && ( (And[s]&a[i]) == And[s] ) ){
            ans[s]++;
        }
        else {
            s++;
            Or[s] = Or[s - 1] | a[i];
            And[s] = And[s - 1] & a[i];
            ans[s] = 1;
        }
    }
    int nowor = a[mid] ,nowand = a[mid];
    for(int i = mid; i >= l ; i--){
        nowor |= a[i];
        nowand &= a[i];
        for(int j = 0 ; j <= s; j++){
            res = (res + ( (1LL * ( nowor | Or[j] ) % mod * ( nowand & And[j] ) )% mod ) * ans[j]) % mod ;
        }
    }
    if(l < mid){
        cnt(l , mid - 1);
    }
    if(r > mid){
        cnt(mid + 1 , r);
    }
}
void work() {
    cin>>n;
    for(int i = 0 ; i < n ; i++)scanf("%d",&a[i]);
    cnt(0,n - 1);
    cout<<res<<endl;
}
int main() {
#ifdef local
    freopen("in", "r", stdin);
#endif
    work();
}
View Code
1509 加长棒
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注

现在有三根木棒,他们的长度分别是a,b,c厘米。你可以对他们进行加长(不同的木棒可以增加不同的长度),他们总的加长长度不能超过L厘米。你也可以不对他们进行加长。

现在请你计算一下有多少种加长的方式使得他们能构成合法的三角形(面积非0)。

Input
单组测试数据。
共一行,包含4 个整数a,b,c,L (1≤a,b,c≤3*10^5, 0≤L≤3*10^5)。
Output
输出答案占一行。
Input示例
1 1 1 2
Output示例
4

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <stack>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> Pii;
const int inf = 0x3f3f3f3f;
const LL INF = 1LL<<60;
const int mod = 1000000007;
const int N = 1e5+5;
const double Pi = acos(-1.0);
const int maxn = 1e5+5;
int a , b , c;
int l ;
LL res = 0;
LL solve(int bigest , int x, int y){
    LL ans = 0;
    int _t = bigest + x + y + l;
    for(int i = 0 ; i <= l ; i++){
        int t = min(_t -  bigest - i , bigest + i);
        if(x + y <= t){
            ans += 1LL * (t - x - y + 2) * (t - x - y + 1) / 2;
        }
    }
    return ans ;
}
void work() {
    cin>>a>>b>>c>>l;
    res = 1LL * (l + 3) * (l + 2) * (l + 1) / 6;
    res -= solve(a,b,c);
    res -= solve(b,a,c);
    res -= solve(c,a,b);
    cout<<res<<endl;
}
int main() {
#ifdef local
    freopen("in", "r", stdin);
#endif
    work();
}
View Code

1491 黄金系统

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注

q=5+12在黄金系统下面a0a1...an等于 ni=0aiqni ,其中 ai 是0或者1。

现在给出两个黄金系统下面的数字,请比较他们的大小。

Input
单组测试数据。
第一行有一个字符串A。
第二行有一个字符串B。
按照a0到an的顺序输入。
他们都是非空串,可能有前导0,并且只有0和1组成,长度不超过100000。
Output
如果A>B,输出>;
如果A=B,输出=;
如果A<B,输出<;
Input示例
00100
11
Output示例
=

#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
#include <string>
#include <stack>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define MP make_pair
#define PB push_back
typedef long long LL;
typedef pair<int,int> Pii;
const int inf = 0x3f3f3f3f;
const LL INF = 1LL<<60;
const int mod = 1000000007;
const int N = 1e5+5;
const double Pi = acos(-1.0);
const int maxn = 1e5+5;
int cp[maxn];
char A[maxn],B[maxn];
void work(){
    cin>>A>>B;
    int alen = strlen(A),blen = strlen(B);
    int cplen = max(alen,blen);
    for(int i = cplen - 1, a = alen - 1,b = blen - 1; i >= 0; i--,a--,b-- ){
        cp[i] = (a >= 0 ? A[a] : \'0\') - (b >= 0 ? B[b] : \'0\');
    }
    for(int i = 0; i < cplen - 2 ; i++){
        if(cp[i]){
            cp[i+1] += cp[i];
            cp[i+2] += cp[i];
            if(cp[i+1] > 10000000){
                cout<<">"<<endl;
                return;
            }
            else if(cp[i+1] < -1000000){
                cout<<"<"<<endl;
                return;
            }
            cp[i] = 0;
        }
    }
    if(cp[cplen-2]==0&&cp[cplen-1] == 0){
        cout<<"="<<endl;
        return;
    }
    double ans = ( sqrt(5.) + 1 )*cp[cplen-2] / 2 +cp[cplen-1];
    if(ans > 0){
        cout<<">"<<endl;
    }
    else cout<<"<"<<endl;
}
int main() {
#ifdef local
    freopen("in", "r", stdin);
#endif
    work();
}
View Code

1607 卷积和

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注

杰西最近在研究卷积,例如一个数字1234,那么经过杰西的变换后,就会变成1*4+2*3+3*2+4*1,例如一个数字是234,那么就会变成2*4+3*3+4*2。

形象化的,我们可以设f(x)表示x经过杰西变换后的值。用公式表示 x=dn1dn2...d2d1d0 那么 f(x)=最小周长

51nod 1267 二分

搜索引擎质量指数 DCG

1390 游戏得分(贪心)

1449 砝码称重

1283 最小周长