BC21&&hdoj5138&&hdoj5139&&hdoj5141
2016-03-02 13:38
225 查看
CET-6 test
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 613 Accepted Submission(s): 440
Problem Description
Small W will take part in CET-6 test which will be held on December 20th.
In order to pass it he must remember a lot of words.
He remembers the words according to Ebbinghaus memory curve method.
He separates the words into many lists. Every day he picks up a new list, and in the next 1st,2nd,4th,7th,15th day,
he reviews this list.
So every day he has many lists to review. However he is so busy, he does not know which list should be reviewed in a certain day. Now he invites you to write a program to tell him which list should to be reviewed in a certain day.
Lists are numbered from 1. For example list 1 should be reviewed in the 2nd,3rd,5th,8th,16th day.
Input
Multi test cases (about 100), every case contains an integer n in a single line.
Please process to the end of file.
[Technical Specification]
2≤n≤100000
Output
For each n,output the list which should be reviewed in the nth day
in ascending order.
Sample Input
2
100
Sample Output
1
85 93 96 98 99
Source
BestCoder Round #21
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<list> #include<vector> using namespace std; const int maxn=1010; int num[10]={1,2,4,7,15}; int main() { int t,i,j,k,n; while(scanf("%d",&n)!=EOF){ for(i=4;i>=1;--i){ if(n-num[i]>0)printf("%d ",n-num[i]); } printf("%d\n",n-1); } return 0; }
Formula
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1157 Accepted Submission(s): 399
Problem Description
f(n)=(∏i=1nin−i+1)%1000000007
You are expected to write a program to calculate f(n) when a certain n is given.
Input
Multi test cases (about 100000), every case contains an integer n in a single line.
Please process to the end of file.
[Technical Specification]
1≤n≤10000000
Output
For each n,output f(n) in a single line.
Sample Input
2
100
Sample Output
2
148277692
Source
BestCoder Round #21
规律好找但是打表超内存在线计算超时离线先保存数据在计算
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<list>
#include<cmath>
#include<vector>
#define MOD 1000000007
using namespace std;
const int maxn=100010;
int num[maxn];
struct Node{
int x,y,ans;
}A[maxn];
bool cmp(Node a,Node b){
return a.x<b.x;
}
void init(int n){
int num[5],cnt=0;num[0]=num[1]=1;
while(A[cnt].x==1){
A[cnt].ans=1;cnt++;
}
for(int i=2;i<=n;++i){
num[i%3]=(long long)num[(i-1)%3]*i%MOD;
num[(i-1)%3]=(long long)num[(i-2)%3]*num[i%3]%MOD;
while(i==A[cnt].x){
A[cnt].ans=num[(i-1)%3];cnt++;
}
}
}
bool cmp1(Node a,Node b){
return a.y<b.y;
}
int main()
{
int i,n=0;
while(scanf("%d",&A
.x)!=EOF){
A
.y=n;n++;
}
sort(A,A+n,cmp);
init(A[n-1].x);
sort(A,A+n,cmp1);
for(i=0;i<n;++i){
printf("%d\n",A[i].ans);
}
return 0;
}
LIS again
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 493 Accepted Submission(s): 184
Problem Description
A numeric sequence of ai is ordered if a1<a2<…<aN.
Let the subsequence of the given numeric sequence (a1,a2,…,aN)
be any sequence (ai1,ai2,…,aiK),
where 1≤i1<i2<…<iK≤N.
For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, eg. (1, 7), (3, 4, 8) and many others.
S[ i , j ] indicates ( ai,ai+1,ai+2,…,aj)
.
Your program, when given the numeric sequence (a1,a2,…,aN),
must find the number of pair ( i, j) which makes the length of the longest ordered subsequence of S[ i , j ] equals to the length of the longest ordered subsequence of (a1,a2,…,aN).
Input
Multi test cases (about 100), every case occupies two lines, the first line contain n, then second line contain n numbers a1,a2,…,aN separated
by exact one space.
Process to the end of file.
[Technical Specification]
1≤n≤100000
0≤ai≤1000000000
Output
For each case,.output the answer in a single line.
Sample Input
3
1 2 3
2
2 1
Sample Output
1
3
Source
BestCoder Round #21
解题思路找出以i结尾的最长子序列长度等于总序列的长度并记录开头的最靠右的第一个元素即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<list>
#include<vector>
using namespace std;
const int maxn=100010;
int dp[maxn][2],n;//dp[i][0]记录前i个的最长上升序列长度dp[i][1]记录该序列开头的第一个元素的位置
int la[maxn],lb[maxn],pos[maxn];
long long LIS(){
dp[1][0]=1;dp[1][1]=1;
memset(pos,0,sizeof(pos));//记录开头位置
lb[1]=la[1];int len=1;pos[1]=1;
for(int i=2;i<=n;++i){
int left=1,right=len;
if(la[i]>lb[len]){
len++;lb[len]=la[i];
pos[len]=max(pos[len],pos[len-1]);
dp[i][0]=len;dp[i][1]=pos[len];
continue;
}
while(left<=right){
int mid=(left+right)>>1;
if(la[i]>lb[mid]){
left=mid+1;
}
else {
right=mid-1;
}
}
lb[left]=la[i];
if(left==1)
pos[left]=i;
else
pos[left]=max(pos[left],pos[left-1]);
dp[i][0]=left;dp[i][1]=pos[left];
}
int l=0;
long long ans=0;
for(int i=1;i<=n;++i){
if(dp[i][0]==len){
l=max(l,dp[i][1]);
}
ans=ans+l;
}
return ans;
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;++i){
scanf("%d",&la[i]);
}
printf("%lld\n",LIS());
}
return 0;
}
相关文章推荐
- 如何在ASP.NET应用程序中初始化
- Java多线程三
- 报表中的Excel操作之Aspose.Cells(Excel模板)
- GIT之旅【第一篇】
- 【云计算】实战-五个Docker监控工具的对比
- 批量改后缀名为jpg
- 内联函数&&函数重载&&函数缺省值
- linux shell脚本读取用户输入的参数
- Java多线程二
- 我最喜欢问应聘者的问题 & 回答思路
- 类型转换的判别
- 图的表示 2.5 样例1
- input 双击后不出现历史记录
- 文件上传linux服务器
- POJ 3744 Scout YYF(概率DP+矩阵快速幂)
- cocos2d-x学习笔记
- 作业二:操作系统是如何工作的进行
- mysqldump: Got error: 1142: SELECT, LOCK TABLES command denied to user 'root'@'localhost' for table
- android内存泄露
- Gpg4Win 加密