周末训练笔记+2017 ACM/ICPC Asia Regional Shenyang Online(9.10)
来源:互联网 发布:大学生网络诈骗统计图 编辑:程序博客网 时间:2024/06/09 21:06
总结下这两天做的题目,昨天的题目与图相关的很多,图的题一般就是遇到没见过就gg了,比如那个有向的加强图那个,,沈阳这个有两个推公式的,但是只过了一个。。。number number number这个题明明结束前显示是过了的,服务器崩了我们三条机器都显示是过了的,刚才回去看的时候成了Output Limit Exceeded,剪不断理还乱风水乱流转苍天饶过谁啊,还有一个最长上升子序列的,写的dp一直超时,后来队友给我改了改a了,换了种方法选最长子序列。一直纠结于那么几个题,导致最后相对容易的拿个根本没人去看,没时间了,匆匆忙忙瞎了已一发,没反馈,就gg了,做题不能“恋战”,有的题真是坑死人。
1002
k盏灯 n个屏幕 从n个屏幕中选择k个 求保证这k盏灯颜色不相同的最少的导线
签到题 队友给我讲了讲意思之后,一下就推出(试出)了公式,k+(n-k)k
这个推到的过程大致就是先把边缘的每一个屏幕连接一盏灯。边缘的先先去掉,这样先保证,对于剩下的n-k个屏幕肯定要至少k种颜色,加上试几个数据,公式就来了
1004
给出一个n的序列和一个k 从中拿出k个数来,剩下的数据中,问你是不是非递增或者非递减的数列
刚开始没什么思路,一直纠结于n个里面拿k个,选择太多了,暴力是绝对不行的,大约卡了半个小时,突然灵光一现,既然是要非递增或者非递减,拿就先把递增或者递减的最长序列的个数求出来,这样剩下的数据如果比k大说明就算k个全拿了递增或者递减序列里的数也无济于事,所以只要满足剩下的数据m<=k即可,<的情况就是剩下的拿出来的数据不够,可以从递增或者递减数列的首尾部位借几个,这样就基本可以做了,无奈的就是写了个最长上升和下降之后超时了
1005
题意很简单,从斐波那契数列里选出k个数据来,求其和,问不能组成的最小的数是多少
数据很大,这一看就不能暴力,一度想求出所有的各项,但是发现不现实,不论是递推求,还是公式求,都是不可行的,后来根据强行写出的项,推出最终的公式,ans=F(2*n+1)-1,完美,现在就只剩下解决斐波那契的事了,听到其他的队伍用什么矩阵求各项,到我那个上百度了个模板,提交之后,一度显示是过了,在排名巴黎斗仙是的过了,但是到莫名其妙的现在又成了没过了。
1012
给出一个序列第一行的,还有惩罚值第二行的,你可以移动一些前面的去队伍的后面求最大的子段和,条件是他必须得大于下面其对应的惩罚值的和,中间有其和加起来比下面的小了就得停止了,问你最少移动几下可以得到最大的值
前面根本没看这个题,最后的时候才知道原来相对于其他的来说还算容易的,匆匆茫茫写的那一个代码,答题思路就是按照题意模拟,因为是可以从尾再到头,所以直接在尾部在加上一段,这样直接循环下来,暴力全部走一遍,所以服务器崩了,一直没有回馈,也没再管,刚才到网上看了看有没有什么更好的方法,
最大子段和思想,对两序列的差,和第一行系列,同时进行。
果然,这种思想更好理解了,做法上和我的基本相似,求子段和更优了,找到小鱼0的时候就结束游戏,重开,在此同时,记录下位置即可,这个题只交了一次,运行错误,是因为数组开小了,如果服务器不崩溃,再改进几次说不一定也可以按照我的那种写过,只可惜看的太晚了这个题
1002
cable cable cable
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Now you have
there is one line contains two integers
3 220 15
490HintAs the picture is shown, when you select M1 and M2, M1 show the color of K1, and M2 show the color of K2.When you select M3 and M2, M2 show the color of K1 and M3 show the color of K2.When you select M1 and M3, M1 show the color of K1. #include <iostream>#include <cstring>#include <stdio.h>#include <algorithm>#include <cmath>using namespace std;int main(){ long long n,k; while (scanf("%lld%lld",&n,&k)!=EOF){ printf("%lld\n",k+(n-k)*k); }}1004
array array array
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Kiddo: "I have an array
34 11 4 3 75 24 1 3 1 26 11 4 3 5 4 6
A is a magic array.A is a magic array.A is not a magic array.#include<stdio.h>#include<iostream>#include<string.h>#include<cstring>#include<algorithm>using namespace std;int map[1000010];int dp[1000010];int dp1[1000010];int main(){ int temp; int i,j; int t; scanf("%d",&t); int n,k; while(t--) { scanf("%d %d",&n,&k); memset(dp,0,sizeof(dp)); memset(dp1,0,sizeof(dp1)); int max1 = 0; int max2 = 0; int flag = 0; for(i=1;i<=n;i++){ scanf("%d",&map[i]); } dp[1] = map[1]; int length = 1; for (int i = 2; i <= n; i++){ if (map[i] > dp[length]) dp[++length] = map[i]; else{ int p = lower_bound(dp,dp + length,map[i]) - dp; dp[p] = map[i]; } } dp1[1] = map[1]; int length1 = 1; for (int i = n; i >= 2 ; i--){ if (map[i] > dp[length1]) dp[++length1] = map[i]; else{ int p = lower_bound(dp,dp + length1,map[i]) - dp; dp[p] = map[i]; } } if (n - length <= k || n - length1 <= k) printf("A is a magic array.\n"); else printf("A is not a magic array.\n"); } return 0;}
number number number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Give you an integer
Now, give you an integer
The answer may be too large. Please print the answer modulo 998244353.
Each test case includes an integer
1
4#include <iostream>//这个代码是未通过的 但是思路就是这样的 根据公式 解决数据范围就基本没有问题了#include <cstring>#include <stdio.h>#include <algorithm>#include <cmath>using namespace std;using namespace std;const int MOD = 10000;struct matrix { int m[2][2];}ans;matrix base = {1, 1, 1, 0};matrix multi(matrix a, matrix b) { matrix tmp; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { tmp.m[i][j] = 0; for(int k = 0; k < 2; k++) tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD; } } return tmp;}int matrix_pow(matrix a, int n) { ans.m[0][0] = ans.m[1][1] = 1; ans.m[0][1] = ans.m[1][0] = 0; while(n) { if(n & 1) ans = multi(ans, a); a = multi(a, a); n >>= 1; } return ans.m[0][1];}int main() { int n; /*while(cin>>n) { cout<<n<<endl; }*/ while(scanf("%d",&n)) { n++; printf("%d\n",(matrix_pow(base,2*n+1)-1)%998244353); } return 0;}
1012
card card card
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
One day, MJF takes a stack of cards and talks to him: let's play a game and if you win, you can get all these cards. MJF randomly assigns these cards into
Before the game starts, WYJ can move the foremost heap to the end any times.
After that, WYJ takes the heap of cards one by one, each time he needs to move all cards of the current heap to his hands and face them up, then he turns over some cards and the number of cards he turned is equal to the
If at one moment, the number of cards he holds which are face-up is less than the
Your task is to help WYJ maximize the number of cards he can get in the end.So he needs to decide how many heaps that he should move to the end before the game starts. Can you help him find the answer?
MJF also guarantees that the sum of all "penalty value" is exactly equal to the number of all cards.
For each test case:
the first line is an integer
next line contains
then the third line also contains
54 6 2 8 41 5 7 9 2
4HintFor the sample input:+ If WYJ doesn't move the cards pile, when the game starts the state of cards is:4 6 2 8 41 5 7 9 2WYJ can take the first three piles of cards, and during the process, the number of face-up cards is 4-1+6-5+2-7. Then he can't pay the the "penalty value" of the third pile, the game ends. WYJ will get 12 cards.+ If WYJ move the first four piles of cards to the end, when the game starts the state of cards is:4 4 6 2 82 1 5 7 9WYJ can take all the five piles of cards, and during the process, the number of face-up cards is 4-2+4-1+6-5+2-7+8-9. Then he takes all cards, the game ends. WYJ will get 24 cards.It can be improved that the answer is 4.**huge input, please use fastIO.**
#include<stdio.h>//贴个代码吧
//添上几句注释typedef long long ll;const int MAX=1e6+5;const int INF=0x3f3f3f3f;int n,a[3*MAX],b[3*MAX];int main(){ while(~scanf("%d",&n)) { int s=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i+n]=a[i];// 先构建循环的数列 } for(int i=1;i<=n;i++) { int x; scanf("%d",&x); b[i]=a[i]-x;//做差的最大子段和 b[i+n]=b[i]; } int sum=0,suma=0; int maxa=-INF; int l,r,temp=1; for(int i=1;i<=2*n;i++) { suma+=a[i];//最终需要的最大值 sum+=b[i];//判断的差值 <0则结束 if(suma>maxa) { maxa=suma; l=temp; r=i; } if(sum<0) { suma=0; sum=0; temp=i+1; if(temp>n+1)break; } } printf("%d\n",l-1); } return 0;}
- 周末训练笔记+2017 ACM/ICPC Asia Regional Shenyang Online(9.10)
- 周末训练笔记+2017 ACM/ICPC Asia Regional Qingdao+Xian Online(9.17)
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional Shenyang Online
- 2017 ACM/ICPC Asia Regional shenyang Online
- 2015 ACM/ICPC Asia Regional Shenyang Online
- 2015 ACM/ICPC Asia Regional Shenyang Online
- 2015 ACM/ICPC Asia Regional Shenyang Online
- 2015 ACM/ICPC Asia Regional Shenyang Online
- 2015 ACM/ICPC Asia Regional Shenyang Online
- 2016 ACM/ICPC Asia Regional Shenyang Online
- Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online
- Problem 1004-2017 ACM/ICPC Asia Regional Shenyang Online
- 讨论MyISAM和InnoDB两个存储引擎的索引实现方式
- 【洛谷1119】灾后重建
- Leetcode代码学习周记——Two Sum
- 代码传递信息方式的探究
- struts2框架浅析
- 周末训练笔记+2017 ACM/ICPC Asia Regional Shenyang Online(9.10)
- 图像特效之随机滤波(Randomblue)
- 软考之探路:大纲
- leetcode 673. Number of Longest Increasing Subsequence
- HashMap实现原理及源码分析
- maven 构建项目时,modules子模块,module对应name中的字段
- 二叉树中出现的错误
- HDU 6205:card card card
- 计蒜客16 爬楼梯 动态规划入门