Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
Posted 蒻
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]相关的知识,希望对你有一定的参考价值。
题目来源: 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 cbaOutput示例样例输出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; }
基准时间限制: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 3Output示例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(""); } }
基准时间限制: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 5Output示例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(); }
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 2Output示例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(); }
题目来源: CodeForces基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题收藏关注q在黄金系统下面a0a1...an等于 ∑ni=0ai∗q ,其中 ai 是0或者1。
现在给出两个黄金系统下面的数字,请比较他们的大小。
Input单组测试数据。 第一行有一个字符串A。 第二行有一个字符串B。 按照a0到an的顺序输入。 他们都是非空串,可能有前导0,并且只有0和1组成,长度不超过100000。Output如果A>B,输出>; 如果A=B,输出=; 如果A<B,输出<;Input示例00100 11Output示例=
#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(); }
基准时间限制: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=d 那么 f