oj

Comet OJ - Contest #11 B题 usiness

旧时模样 提交于 2019-11-27 05:12:44
###题目链接### 题目大意: 一开始手上有 0 个节点,有 n 天抉择,m 种方案,在每天中可以选择任意种方案、任意次地花费 x 个节点(手上的节点数不能为负),使得在 n 天结束后,获得 y 个节点。 其次,在每天结束后,会根据自己手上所具有的节点数来获得一些节点,设当天结束后所拥有 x 个节点,那么将获得 f(x) 个节点。 分析: 1、将全过程分为 n 天,每天开始有一定的节点数,然后 DP 求得花费后的最大价值(这个最大价值指的是,n 天结束后仅返还获得的最大节点数)。 故设 dp[i][j] 表示在第 i 天花费操作完后,所能在最后一天返还节点数的最大值。 2、很显然这是一个完全背包问题。在 DP 处理每天话费节点之前,需要更新当天最开始所拥有的节点数所代表的 价值 (即结束返还的总节点数)。而当天一开始的节点数由上一天末尾所持有的节点数 x + 上一天结束后获得的节点数 f(x) 。 故枚举上一天结束后所持有的节点数 j ,则有: d p[i][j+f[j]]=max( dp[i][j+f[j]] , dp[i-1][j] ) 。 直接枚举物品数: #include<iostream> #include<algorithm> #include<string.h> using namespace std; int n,m,k; int s[1008]; int dp

Comet OJ - Contest #11 B usiness

☆樱花仙子☆ 提交于 2019-11-27 05:12:30
题目思路: 很明显的dp题,就是以天数作为阶段,然后里面套一个完全背包,因为每天结束时会得到节点,所以 在天数的循环最后还要加一个循环用来加上每天结束时得到的节点。 dp[u]表示现在有u个节点时最后能得到多少个节点,有几个地方要注意,首先是当前有的节点数要从2000开始循环 ,因为w[i]和k的范围是1000,假如说当前有1000个节点,那么又得到1000个节点,所以最多可能有2000个节点(大于k得到的节点是0)。 其次是最后加上每天得到的节点数时要取一个最大值。最后答案要记得加上当前有的节点数。 代码: #include<bits/stdc++.h> using namespace std; int dp[10010],w[10010],n,m,k,ans; pair<int,int>p[101];//代表题目中的ai,bi int main() { memset(dp,128,sizeof(dp)); scanf("%d%d%d",&n,&m,&k); for(int i = 0;i<=k;i++) scanf("%d",&w[i]); for(int i = 1;i<=m;i++) scanf("%d%d",&p[i].first,&p[i].second); dp[0] = 0; for(int i = 1;i<=n;i++)//天数 { for(int j = 1;j

Comet OJ - Contest #14 B

强颜欢笑 提交于 2019-11-27 05:12:16
夕日的光辉 #include <stdio.h> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #pragma GCC optimize(2) #define mm(i,v) memset(i,v,sizeof i); #define mp(a, b) make_pair(a, b) #define one first #define two second using namespace std; typedef long long ll; typedef pair<int, int > PII; const int N = 1e6 + 5, mod = 1e9 + 9, INF = 0x3f3f3f3f; int t, n, p1, p2, p3, p4, flag; char s[N]; int main() { cin >> t; while (t--) { cin >> n; scanf("%s", s + 1); p1 = 0, p2 = 0, p3 = 0, p4 = 0; for (int i = 1; i <= n; ++i) { if (s[i] == 'p') p1 = 1; if (s

Comet OJ - Contest #8题解

笑着哭i 提交于 2019-11-27 04:35:16
传送门 \(A\) 咕咕咕 const int N=1005; char s[N][N];int len[N],n,id; inline bool cmp(R int j,R int k){ R int l=min(len[j],len[k]); fp(i,1,l)if(s[j][i]!=s[k][i])return s[j][i]<s[k][i]; return len[j]<len[k]; } int main(){ scanf("%d",&n),id=1; fp(i,1,n)scanf("%s",s[i]+1),len[i]=strlen(s[i]+1); fp(i,1,n)if(cmp(i,id))id=i; printf("%s\n",s[id]+1); return 0; } \(B\) 咕咕 const int N=1e5+5; typedef long long ll; int a[N],n;ll sum,sp,res; int main(){ scanf("%d",&n); fp(i,1,n)scanf("%d",&a[i]),sum+=a[i],sp+=1ll*a[i]*a[i]; fp(i,1,n)printf("%lld ",sp+1ll*n*a[i]*a[i]-(sum*a[i]<<1)); return 0; } \(C\) 首先把所有的 \(p_i=b

Comet OJ - Contest #8C 符文能量___dp

梦想与她 提交于 2019-11-27 01:32:03
题目大意: 分析: 发现最后的答案就是 b 1 ∗ a 2 + b 2 ∗ a 3 + … … + b n − 1 ∗ a n b_1*a_2+b_2*a_3+……+b_{n-1}*a_n b 1 ​ ∗ a 2 ​ + b 2 ​ ∗ a 3 ​ + … … + b n − 1 ​ ∗ a n ​ 然后对于其中的一些连续的项需要乘上 k k k 或者 k 2 k^2 k 2 如果 a i ∗ k a_i*k a i ​ ∗ k ,那么 b i b_i b i ​ 也要 ∗ k *k ∗ k 第 i i i 项是 b i ∗ a i + 1 b_i*a_{i+1} b i ​ ∗ a i + 1 ​ , 设 d p i , 0 , 0 dp_{i,0,0} d p i , 0 , 0 ​ 表示前i项中,当前项中 b i , a i + 1 b_i,a_{i+1} b i ​ , a i + 1 ​ 都没有进行 ∗ k *k ∗ k 操作,前面也没有进行 ∗ k *k ∗ k 操作时的最小合并代价 设 d p i , 0 , 1 dp_{i,0,1} d p i , 0 , 1 ​ 表示前i项中,当前项中 b i , a i + 1 b_i,a_{i+1} b i ​ , a i + 1 ​ 都没有进行 ∗ k *k ∗ k 操作,前面进行了 ∗ k *k ∗ k

Comet OJ - Contest #8

前提是你 提交于 2019-11-27 01:21:49
---恢复内容开始---      Comet OJ - Contest #8参赛总结—— 林荫 本人还是一如既往的菜。 Comet OJ - Contest #X属于ACM赛制 六道题目难度从入门到金牌递增   本次总结给出T3,4分析与解法(5,6以后填坑)    T3:符文能量 1000ms,256MB 题目描述 米薇女王万万没有想到考德威尔男爵的真实意图。她的脑海里浮现出莱里亚的秀美山河,可惜再也回不去了。 不过所幸的是,她还有着军队和重整山河的勇气。雷纳德为米薇女王呈上了 nn n 块符文石。符文石可以帮助你更好的战斗。每个符文石拥有能量,米薇可以挑选类型相近的符文石融合并释放出能量。 形象的,我们可以把每个符文石 PiP_i P i ​ 描述成一个二元组 (ai,bi)(a_i,b_i) ( a i ​ , b i ​ ) 。对于两个相邻的符文石 PiP_i P i ​ 与 Pi+1 P_{i+1} P i + 1 ​ ,可以把他们融合为 (ai,bi+1)(a_i,b_{i+1}) ( a i ​ , b i + 1 ​ ) 并释放出 ai+1∗bia_{i+1}*b_i a i + 1 ​ ∗ b i ​ 的能量。融合完的符文石会替换掉原本的两个二元组,出现在他们的位置上。米薇希望把所有的 nn n 个符文石融合成 11 1 个符文石

Comet OJ - Contest #8 神奇函数

烈酒焚心 提交于 2019-11-26 23:09:43
题意: 思路:    首先我们打表观察得到,f(x)为 x分解质因数之后 ∏pi^(ti/2)     再分析可得,∑f(i)=n/(1*1)*1*只为1的个数+n/(2*2)*2*只为2的个数+...    但是结果超时。    在进行分析可得,只为x的个数 就是phi(x)。 #include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,a,b) for(int i=b;i>=a;i--) using namespace std; #define ll long long const int N=3e5+5; ll rd() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int T; ll n; ll f[10000010],ans,sum; int main() { T=rd(); while(T--) { ans=0;sum=0; n=rd(); int p=sqrt(n); dep(i,2,p) { int x=i+i; f

Comet OJ - Contest #8 B [支援城市]

旧巷老猫 提交于 2019-11-26 19:16:11
Comet OJ - Contest #8 B 支援城市 直接模拟 \(O(n^2)\) TLE ,把式子展开计算, \(O(n)\) \[\sum_{i = 1}^n {(w_i - w_x)^2} = \sum_{i = 1}^n(w_i^2 - 2w_iw_x + w_x^2) = \sum_{i = 1}^n w_i^2 - 2w_x\sum_{i = 1}^n w_i + \sum_{i = 1}^n w_x^2\] 将 $ \sum_{i = 1}^n w_i^2$ 记作 \(ss\) 将 \(\sum_{i = 1}^n w_i\) 记作 \(s\) 上述表达式简写成 : $ ss - 2w_xs + nw_x^2$ 代码 #include <iostream> using namespace std; const int N = 1e5 + 10; typedef long long ll; ll a[N],s,ss; int main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int n; cin >> n; for(int i = 0;i < n; ++i){ cin >> a[i]; s += a[i]; ss += a[i] * a[i]; } for(int i = 0;i < n; ++i){

JZ高中OJ 1036. [SCOI2009]迷路

ⅰ亾dé卋堺 提交于 2019-11-26 17:41:30
Time Limits: 1000 ms Memory Limits: 65536 KB Detailed Limits Description windy在有向图中迷路了。 该有向图有 N 个节点,windy从节点 0 出发,他必须恰好在 T 时刻到达节点 N-1。 现在给出该有向图,你能告诉windy总共有多少种不同的路径吗? 注意:windy不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。 Input 第一行包含两个整数,N T。 接下来有 N 行,每行一个长度为 N 的字符串。 第i行第j列为'0'表示从节点i到节点j没有边。 为'1'到'9'表示从节点i到节点j需要耗费的时间。 Output 输出一个整数,可能的路径数,这个数可能很大,只需输出这个数除以2009的余数。 Sample Input 2 2 11 00 Sample Output 1 Data Constraint Hint 100%的数据,满足 2 <= N <= 10 ; 1 <= T <= 1000000000 。 1 #include <bits/stdc++.h> 2 using namespace std; 3 int mod=2009; 4 int n,t; 5 struct pp{ 6 int m[115][115]; 7 }a; 8 int c; 9 inline pp mul

JZ初中OJ 2296. [noip普及组2]神殿

烂漫一生 提交于 2019-11-26 17:41:19
input: temple.in output: temple.out 时间限制: 1500 ms 空间限制: 524288 KB 具体限制 题目描述 输入 输出 样例输入 样例输入1 2 2 +* *U 1 1 2 2 样例输入2 2 3 <>< ><> 1 1 2 1 样例输出 样例输出1 -1 样例输出2 4 数据范围限制 提示 题目标中的特殊符号:<>^v+*|- 1 #include<bits/stdc++.h> 2 using namespace std; 3 struct way 4 { 5 bool up[1010][1010]; 6 bool left[1010][1010]; 7 bool right[1010][1010]; 8 bool down[1010][1010]; 9 }a[4]; 10 int n,m,f[4000100],x1,y2,x2,y3,b[4000100][3],d[4000100],next[4]={1,2,3,0}; 11 bool sf[1010][1010][4]; 12 char a1[1010][1010]; 13 void bfs() 14 { 15 int head=0,tail=1,x,y,z,nx,ny,nz; 16 b[1][0]=x1; 17 b[1][1]=y2; 18 b[1][2]=0; 19 while