A :给出正方形的两个点求出另外两个点,没有的话输出-1
B:数列的最大差,以及最大差的组合数量。如果最小和最大的数不同,数量直接相乘就是组合数量,如果两个数相同的话,数量为C(2,n)=n*(n-1)/2.
C:安排每个人的出行坐车情况,是没有两个人同坐一辆车d天。
输出是一个n*d 的数列, 每一列代表一个学生的出行坐车情况。可以用K进制模拟,这样就保证任何两个人的情况不同,最大值为K^d.
/*************************************************************************
> File Name: 1003.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 2014/8/16 0:07:53
************************************************************************/
#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 50000+5
#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)
#define ull unsigned long long
#define ll long long
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
int val[1005][1005];
int main()
{
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,k,d;
int i,j;
while( cin>>n>>k>>d){
int temp=1;
for(i=1;i<=d;i++){
temp*=k;
if(temp>=n)break;
}
if(temp<n){
cout<<-1<<endl;
}
else
{
cle(val);
k--;
for(i=2;i<=n;i++)
{
val[d][i]=val[d][i-1];
val[d][i]++;
int ip=0;
if(val[d][i]>k)
{
val[d][i]=0;
ip=1;
}
for(j=d-1;j>=1;j--)
{
val[j][i]=val[j][i-1];
val[j][i]+=ip;
if(val[j][i]>k)
{
val[j][i]=0;
}
else ip=0;
}
}
for(i=1;i<=d;i++)
{
for(j=1;j<=n;j++)
{
cout<<val[i][j]+1<<" ";
}
cout<<endl;
}
}
}
return 0;
}
树状数组。
从后往前,先统计(这个位置向前的值)后插入(这个位置向后的值),树状数组快速求比这个值小的数的数量就好了。
但是我的程序莫名其妙用了,离散,表示很没用。
/*************************************************************************
> File Name: 1004.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 2014/8/16 1:21:38
************************************************************************/
#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 1111110+5
#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)
#define ull unsigned long long
#define ll long long
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
ll val[maxn];
struct node{
int v;
int ip;
int newv;
int numm;
int numn;
};
node tree[maxn];
int sum1[maxn];
int sum2[maxn];
int lowbit(int x)
{
return x&(-x);
}
void update(int x)
{
for(int i=x;i<maxn;i+=lowbit(i)){
val[i]+=1;
}
}
ll getsum(int x)
{
ll sum=0;
int i=x;
i--;
for(;i>0;i-=lowbit(i))
{
sum+=val[i];
}
return sum;
}
int num[maxn];
bool cmp(node a,node b)
{
return a.v<b.v;
}
bool cm(node a,node b)
{
return a.ip<b.ip;
}
map<int,int>mp;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
int i,j,k;
int n,m;
// freopen("in.txt","r",stdin);
cle(val),cle(num);
while(cin>>n)
{
mp.clear();
m=0;
rep(i,n){
scanf("%d",&tree[i].v);
tree[i].ip=i;
}
sort(tree,tree+n,cmp);
rep(i,n)
{
if(mp[tree[i].v]==0)
{
mp[tree[i].v]=++m;
tree[i].newv=m;
}
else{
tree[i].newv=mp[tree[i].v];
}
}
sort(tree,tree+n,cm);
cle(sum1),cle(sum2);
rep(i,n){
sum1[tree[i].newv]++;
tree[i].numm=sum1[tree[i].newv];
}
for(i=n-1;i>=0;i--)
{
sum2[tree[i].newv]++;
tree[i].numn=sum2[tree[i].newv];
}
update(tree[n-1].numn);
ll ans=0;
for(i=n-2;i>=0;i--)
{
ans+=getsum(tree[i].numm);
if(tree[i].numn==0)continue;
update(tree[i].numn);
}
cout<<ans<<endl;
}
return 0;
}
E:找出一条路径,路径满足权值增大的顺序,求最长的路径数量。
dp比较弱,这个题就算是学习了。
对路径进行dp,看别人代码也学习了不少的技巧~不错,
/*************************************************************************
> File Name: 1005.cpp
> Author: cy
> Mail: 1002@qq.com
> Created Time: 2014/8/17 10:30:01
************************************************************************/
#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 500000+5
#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)
#define ull unsigned long long
#define ll long long
#define cle(a) memset(a,0,sizeof(a))
#define mp make_pair
using namespace std;
typedef pair<int,int>p;
typedef pair<int,p>pi;
vector <int>V;
int dp1[maxn];
int dp[maxn];
pi val[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
int i,j,k;
int n,m;
while(cin>>n>>m)
{
cle(dp1),cle(dp);
rep(i,m)
{
int u,v,c;
cin>>u>>v>>c;
u--,v--;
val[i]=mp(c,mp(u,v));
}
sort(val,val+m);
rep(i,m)
{
j=i;
while(j<m&&val[i].first==val[j].first)
{
j++;
}
V.clear();
for(k=i;k<j;k++)
{
int u,v;
u=val[k].second.first;
v=val[k].second.second;
dp1[v]=max(dp1[v],dp[u]+1);
V.push_back(v);
}
int len=V.size();
rep(k,len)
{
dp[V[k]]=max(dp[V[k]],dp1[V[k]]);
}
i=j-1;
}
cout<<*max_element(dp,dp+n)<<endl;
}
return 0;
}