C.
很明显,不满足条件是尽量多删后面的
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N= 1e5 + 5 ;
int n, x, ans;
int a[ N] ;
signed main ( ) {
scanf ( "%lld%lld" , & n, & x) ;
for ( register int i= 1 ; i<= n; ++ i) scanf ( "%lld" , & a[ i] ) ;
for ( register int i= 1 ; i<= n; ++ i)
{
int now= x- a[ i- 1 ] ;
if ( now< a[ i] )
{
ans+ = a[ i] - now;
a[ i] = now;
}
}
printf ( "%lld\n" , ans) ;
return 0 ;
}
D.
找规律…
#include <bits/stdc++.h>
using namespace std;
int len;
char str[ 100005 ] ;
int main ( ) {
scanf ( "%s" , str+ 1 ) ;
len= strlen ( str+ 1 ) ;
if ( str[ 1 ] == str[ len] )
{
if ( len% 2 == 0 ) puts ( "First" ) ;
else puts ( "Second" ) ;
}
else
{
if ( len% 2 == 0 ) puts ( "Second" ) ;
else puts ( "First" ) ;
}
return 0 ;
}
E.
完全图千万别头铁加堆优化啊…
#include <bits/stdc++.h>
using namespace std;
const int N= 1e3 + 5 ;
int n;
double sx, sy, tx, ty;
double d[ N] , path[ N] [ N] ;
bool vis[ N] ;
struct number{ double x, y, r; } num[ N] ;
inline double dis ( double x, double y, double xx, double yy)
{
return sqrt ( ( x- xx) * ( x- xx) + ( y- yy) * ( y- yy) ) ;
}
int main ( ) {
scanf ( "%lf%lf%lf%lf" , & sx, & sy, & tx, & ty) ;
scanf ( "%d" , & n) ;
num[ 0 ] . x= sx; num[ 0 ] . y= sy; num[ 0 ] . r= 0 ;
num[ n+ 1 ] . x= tx; num[ n+ 1 ] . y= ty; num[ n+ 1 ] . r= 0 ;
for ( register int i= 1 ; i<= n; ++ i) scanf ( "%lf%lf%lf" , & num[ i] . x, & num[ i] . y, & num[ i] . r) ;
for ( register int i= 0 ; i<= n+ 1 ; ++ i)
for ( register int j= 0 ; j<= n+ 1 ; ++ j)
if ( i!= j)
{
path[ i] [ j] = max ( 0.0 , dis ( num[ i] . x, num[ i] . y, num[ j] . x, num[ j] . y) - num[ i] . r- num[ j] . r) ;
}
double inf= 1000000000000000 ;
for ( register int i= 0 ; i<= n+ 1 ; ++ i) d[ i] = inf;
d[ 0 ] = 0 ;
for ( register int i= 0 ; i<= n+ 1 ; ++ i)
{
int k;
double minn= inf;
for ( register int j= 0 ; j<= n+ 1 ; ++ j)
if ( ! vis[ j] && d[ j] < minn)
{
minn= d[ j] ;
k= j;
}
vis[ k] = true ;
for ( register int j= 0 ; j<= n+ 1 ; ++ j)
if ( ! vis[ j] && d[ j] > d[ k] + path[ k] [ j] ) d[ j] = d[ k] + path[ k] [ j] ;
}
printf ( "%.10f\n" , d[ n+ 1 ] ) ;
return 0 ;
}
F.
对于一个循环节为x的字符串来说,每次将第一个字符移到最后的位置,那么形成的不同字符串,很明显就是循环节的长度x。
我们把n的所有因子处理出后,设dp[i]表示:回文串的循环节为a[i]时,回文串的个数。
dp[i]=2^((a[i]+1)/2)-Σdp[j](j为i因子)
然后,上面提到了,一个循环节为a[i]的字符串,形成的不同字符串的个数为循环节长度a[i]。所以ans+=dp[i]*a[i]。
但是,当a[i]为偶数时,因为是回文串,所以形成的a[i]/2个字符串是会和另外的一个回文串形成的a[i]/2个字符串重复的。
所以当a[i]为偶数时,每个回文串的贡献只有a[i]/2了。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N= 2e3 + 5 , MOD= 1e9 + 7 ;
int n, k, ans, cnt;
int a[ N] , dp[ N] ;
inline int pow ( int a, int n)
{
int res= 1 ;
while ( n)
{
if ( n& 1 ) res= res* a% MOD;
a= a* a% MOD;
n>>= 1 ;
}
return res;
}
signed main ( ) {
scanf ( "%lld%lld" , & n, & k) ;
for ( register int i= 1 ; i* i<= n; ++ i)
if ( n% i== 0 )
{
a[ ++ cnt] = i;
if ( n/ i!= i) a[ ++ cnt] = n/ i;
}
sort ( a+ 1 , a+ cnt+ 1 ) ;
for ( register int i= 1 ; i<= cnt; ++ i)
{
dp[ i] = pow ( k, ( a[ i] + 1 ) / 2 ) ;
for ( register int j= 1 ; j< i; ++ j) if ( a[ i] % a[ j] == 0 ) dp[ i] = ( dp[ i] - dp[ j] + MOD) % MOD;
if ( a[ i] % 2 == 1 ) ans= ( ans+ dp[ i] * a[ i] % MOD) % MOD;
else ans= ( ans+ dp[ i] * ( a[ i] / 2 ) % MOD) % MOD;
}
printf ( "%lld\n" , ans) ;
return 0 ;
}