https://vjudge.net/contest/312189#overview
这可真是……找规律专场。
本蒟被虐哭了TwwwwT。。。?
一定要记得longlong的数字后边加ll!!!
就因为这个,三个小时的比赛WA了两个多小时wwwwwwww!!!!!
觉得自己写的真的没错的题,可以考虑重新写一遍!!说不定就对了!!!
A CodeForces 1096A
直接输出 l ∗ 2 l*2 l∗2……
B CodeForces 1096B
要记得开longlong。。
我也不知道为什么我写错了!!但是重写一遍就过了!!!exm???
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll M = 998244353ll;
string s;
ll l,c1,c2;
int main(){
ios::sync_with_stdio(false);
cin >> l >> s;
ll i = 1ll,j = l-2ll;
c1=1ll;c2=1ll;
while(i < l){
if(s[i] != s[i-1ll]) break;
i ++;
c1 ++;
}
while(j >= i){
if(s[j] != s[j+1ll]) break;
j --;
c2 ++;
}
if(s[0ll] == s[l-1ll]) cout <<(((c1+1ll)%M)*((c2+1ll)%M))%M << endl;
else cout << (c1+c2+1ll)%M<<endl;
return 0;
}
C CodeForces 1096C
在纸上画一画,你就会很轻易地发现所求的角度要满足这个:
a
∗
n
=
k
∗
180
a*n = k*180
a∗n=k∗180
其中
k
<
n
−
1
k<n-1
k<n−1
然后,嘿嘿嘿,枚举就好了~
应该是可以先把 1~180° 的角都打出来,然后直接输入输出,会快一些!
D CodeForces 1096D
一个非常简单的dp~
有4个状态,记为h,a,r,d,表示破坏以当前字母结尾的hard前缀的最小代价。比如a,就表示使前方序列没有ha的最小代价。
状态转移呢,就是
当
前
状
态
=
m
i
n
(
当
前
状
态
,
上
一
个
状
态
)
当前状态 = min(当前状态,上一个状态)
当前状态=min(当前状态,上一个状态)
因为破坏前缀的话,只需要破坏自己那一位,或者是破坏自己的前缀,就可以啦!
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll M = 998244353ll;
string s;
ll l,x,ans;
ll h,a,r;
int main(){
ios::sync_with_stdio(false);
cin >> l;
cin >> s;
for(ll i = 0ll;i < l;i ++ ){
cin >> x;
if(s[i]=='h') {
h += x;
}
if(s[i]=='a'){
a += x;
a = min(h,a);
}
if(s[i]=='r'){
r += x;
r = min(a,r);
}
if(s[i]=='d'){
ans += x;
ans = min(r,ans);
}
}
cout <<ans;
return 0;
}
E CodeForces 1096F
不会不会
F CodeForces 1096G
据说是个,,记不住记不住。。。
G SPOJ TRICOUNT
找规律嘛~
每层新增的,正着的三角形有
n
+
(
n
−
1
)
+
(
n
−
2
)
+
.
.
.
+
1
n+(n-1)+(n-2)+...+1
n+(n−1)+(n−2)+...+1个,倒着的有
(
n
−
1
)
+
(
n
−
3
)
+
.
.
.
(n-1)+(n-3)+...
(n−1)+(n−3)+...个,等差数列求和就好了。
只是,要记得给数字加longlong啊!!!
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[1000100];
ll T,n,t;
int main(){
ios::sync_with_stdio(false);
f[1] = 1;
f[2] = 5;
for(ll i = 3;i <= 1000000;i ++){
f[i] = f[i-1ll]+(i+1ll)*i/2ll;
if(i % 2ll == 0) f[i] += i*i/4ll;
else {
t = i/2ll;
f[i] += (i+1ll)*t/2ll;
}
}
cin >> T;
while(T --){
cin >> n;
cout << f[n] << endl;
}
return 0;
}