2019summer系列 第九场

https://vjudge.net/contest/312189#overview
这可真是……找规律专场。
本蒟被虐哭了TwwwwT。。。?

一定要记得longlong的数字后边加ll!!!

就因为这个,三个小时的比赛WA了两个多小时wwwwwwww!!!!!

觉得自己写的真的没错的题,可以考虑重新写一遍!!说不定就对了!!!

A CodeForces 1096A


直接输出 l ∗ 2 l*2 l2……

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 an=k180
其中 k &lt; n − 1 k&lt;n-1 k<n1
然后,嘿嘿嘿,枚举就好了~
应该是可以先把 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+(n1)+(n2)+...+1个,倒着的有 ( n − 1 ) + ( n − 3 ) + . . . (n-1)+(n-3)+... (n1)+(n3)+...个,等差数列求和就好了。
只是,要记得给数字加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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值