Holy Grail
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <iostream>
#define N 307
using namespace std;
typedef long long ll;
ll n,m,q,a,b;
ll mp[N][N],gra[N][N];
int main() {
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
for (int i = 0 ; i < n ; i++)
for (int j = 0 ; j < n ; j++)
{
gra[i][j]=0x3f3f3f3f;
if (i == j)
gra[i][j] = 0;
}
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
gra[u][v]=w;
}
for (ll i = 0 ; i < n ; i++)
for (ll j = 0 ; j < n ; j++)
{
mp[i][j]=gra[i][j];
}
for (ll k = 1 ; k <= 6 ; k++)
{
for (ll k = 0 ; k < n ; k++)
for (ll i = 0 ; i < n ; i++)
for (ll j = 0 ; j < n ; j++)
mp[i][j] = min(mp[i][k] + mp[k][j],mp[i][j]);
scanf("%lld%lld",&a,&b);
printf("%lld\n",-mp[b][a]);
mp[a][b]=-mp[b][a];
}
}
return 0;
}
Greedy sequence
计蒜客
题目实在令人头大,阅读理解很重要。。。
题意: n是字串a的长度,k是间隔最长长度。每个si序列以i开头,后面的数字以降序排列,且选中的相邻数字在a中的间隔<=k。最后的序列是s1,s2…sn的序列的字母个数。
解法: 用一个结构体,w为输入的值,id是在a字串中的下标(是从1开始),m值为满足 <=本身且距离<=k的字母个数,初始为1。自定义排序规则cmp后对数组排序。从前往后(从小到大)遍历,每一个字母与它前一个比较,若id之差<=k满足题意,i的m值加上i-1的,最后输出所有m值。
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=1e5+10;
struct node{
int id;
int w,m;
}a[maxn];
bool cmp(node a,node b){
return a.w<b.w;
}
int main(){
int T;
cin>>T;
while(T--){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i].w;
a[i].id=i;
a[i].m=1;
}
sort(a+1,a+1+n,cmp);
for(int i=2;i<=n;i++){
for(int j=i-1;j>=1;j--){
if(abs(a[i].id-a[j].id)<=k){
a[i].m+=a[j].m;//!
break;
}
}
}
for(int i=1;i<n;i++)
cout<<a[i].m<<" ";
cout<<a[n].m<<endl;
}
return 0;
}