zoj1107
#include <stdio.h>
#include <string.h>
int n, k;
int grid[105][105];
int mem[105][105];
int memSearch(int r, int c)
{
int r1, c1, i;
int max = 0;
if(mem[r][c] != -1) return mem[r][c];
for(i = 1;i <= k;i++){
r1 = r - i;
if(r1 >= 1 && r1 <= n && grid[r][c] < grid[r1][c]){
mem[r1][c] = memSearch(r1, c);
if(mem[r1][c] > max) max = mem[r1][c];
}
r1 = r + i;
if(r1 <= n && r1 >= 1 && grid[r][c] < grid[r1][c]){
mem[r1][c] = memSearch(r1, c);
if(mem[r1][c] > max) max = mem[r1][c];
}
c1 = c - i;
if(c1 >= 1 && c1 <= n && grid[r][c] < grid[r][c1]){
mem[r][c1] = memSearch(r, c1);
if(mem[r][c1] > max) max = mem[r][c1];
}
c1 = c + i;
if(c1 <= n && c1 >= 1 && grid[r][c] < grid[r][c1]){
mem[r][c1] = memSearch(r, c1);
if(mem[r][c1] > max) max = mem[r][c1];
}
}
return max + grid[r][c];
}
int main()
{
int i, j;
while(scanf("%d%d", &n, &k)){
if(n == -1 && k == -1) break;
for(i = 1;i <= n;i++)
for(j = 1;j <= n;j++)
scanf("%d", &grid[i][j]);
memset(mem, -1, sizeof(mem));
printf("%d\n", memSearch(1, 1));
}
return 0;
}
zoj1108
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
struct mouse {
int weight, speed, id;
} mice[1001];
int cmp(const void * a, const void * b)
{
mouse* ta = (mouse*) a;
mouse* tb = (mouse*) b;
if(ta -> weight == tb -> weight)
return tb -> speed - ta -> speed;
return ta -> weight - tb -> weight;
}
void output(int path[], int pos)
{
if(pos == 0) return;
output(path, path[pos]);
printf("%d\n", mice[pos].id);
}
int main()
{
int n = 1;
while(scanf("%d%d", &mice[n].weight, &mice[n].speed)!=EOF)
{
mice[n].id = n;
n++;
}
qsort(mice, n, sizeof(mouse), cmp);
int count[1001] = {0};
int path[1001] = {0};
count[1] = 1;
for(int i = 2; i < n; i++)
{
for(int j = 1; j < i; j++)
if(mice[i].weight > mice[j].weight && mice[i].speed < mice[j].speed)
if(count[i] < count[j])
{
count[i] = count[j];
path[i] = j;
}
count[i]++;
}
int max = 0;
int pos;
for(int i = 1; i < n; i++)
if(count[i] > max)
{
max = count[i];
pos = i;
}
printf("%d\n", max);
output(path, pos);
return 0;
}
zoj1132
#include <stdio.h>
#include <memory.h>
int C,T;
struct {
int time, city;
} change[1000][100];
char name[100][100];
int start, dist;
int train[1000];
int travel[100];
int search (char *cityName)
{
int i;
for (i = 0; i<C; i++)
if (!strcmp(name[i], cityName))
return i;
return -1;
}
void solve(int departure)
{
int i,j,k;
for (i = 0; i<C; i++)
travel[i] = 1000000;
travel[start] = departure;
for (k = 0; k<C; k++)
for (i = 0; i<T; i++)
for (j = 0; j<train[i]-1; j++)
if (change[i][j].time>=travel[change[i][j].city]
&& travel[change[i][j+1].city]>change[i][j+1].time)
travel[change[i][j+1].city] = change[i][j+1].time;
for (i = 0; i<C; i++)
if (i!=dist)
travel[i] = -1;
for (k = 0; k<C; k++)
for (i = 0; i<T; i++)
for (j = 0; j<train[i]-1; j++)
if (change[i][j+1].time<=travel[change[i][j+1].city]
&& travel[change[i][j].city]<change[i][j].time)
travel[change[i][j].city] = change[i][j].time;
}
int main()
{
int i,j;
char str[1000];
int departure;
int iCase = 0;
while (scanf("%d",&C) && C)
{
for (i = 0; i<C; i++)
scanf("%s", name[i]);
scanf("%d",&T);
for (i = 0; i<T; i++)
{
scanf("%d", &train[i]);
for (j = 0; j<train[i]; j++)
{
scanf("%d%s", &change[i][j].time, str);
change[i][j].city = search(str);
}
}
scanf("%d",&departure);
scanf("%s",str);
start = search(str);
scanf("%s",str);
dist = search(str);
solve(departure);
printf("Scenario #%d\n",++iCase);
if (travel[dist]<1000000)
{
printf("Departure %.4d %s\n",travel[start],name[start]);
printf("Arrival %.4d %s\n\n",travel[dist],name[dist]);
}
else
printf("No connection\n\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
#define MAXN 1000
#define MAXM 60
const int INF = 999999999;
char word[MAXN][MAXM];
int width;
int len[MAXN];
int line[MAXN];
void DP(int num) {
int i, j;
int badness[MAXN];
badness[num] = 0;
for(i = num - 1; i >= 0; i--) {
line[i] = 1;
j = 1;
int total = 0;
int min = INF;
while(i+j-1 < num && total+len[i+j-1]+j-1 <=width) {
total += len[i+j-1];
int score = badness[i + j];
if (j==1) score += 500;
else {
int q = (width - total) / (j-1);
int r = (width - total) % (j-1);
score += r*q*q + (j-1-r)*(q-1)*(q-1);
}
if(score <= min) {
min = score;
line[i] = j;
}
j++;
}
badness[i] = min;
}
}
int main()
{
int i, j;
char ch[500];
while(scanf("%d\n", &width) && width) {
int word_num = 0;
while(gets(ch) && strlen(ch)) {
int pos = 0;
while(ch[pos]) {
sscanf(ch+pos, "%s", word[word_num]);
len[word_num] = strlen(word[word_num]);
pos += strlen(word[word_num++]);
while (ch[pos] && ch[pos]==' ') pos++;
}
}
DP(word_num);
int k = 0;
while(k < word_num) {
int total = 0;
for(i = k; i < k + line[k]; i++)
total += len[i];
if(line[k] == 1) {
printf("%s\n", word[k]);
k ++;
continue;
}
int q = (width - total) / (line[k] - 1);
int r = (width - total) % (line[k] - 1);
for(i = k; i < k + line[k] - 1; i++) {
printf("%s", word[i]);
int space = q + (i >= k + line[k] - 1 - r);
for (j=0; j<space; j++)
putchar(' ');
}
printf("%s\n", word[line[k] + k - 1]);
k += line[k];
}
printf("\n");
}
return 0;
}
zoj1149
#include<stdio.h>
#include<string.h>
int a[7];
void DP(int sum) {
int i,j,k;
int mid = sum/2;
char visit[200];
memset(visit,0,sizeof(visit));
int t;
visit[0] = 1;
for(i=1; i<=6; i++)
for(j=mid; j>=0; j--)
if (visit[j])
for(k=1; k<=a[i]; k++)
{
t = j+i*k;
if (t>mid) break;
else visit[t] = 1;
if (t==mid) {
printf("Can be divided.\n\n");
return;
}
}
printf("Can't be divided.\n\n");
}
int main()
{
int i;
int iCase = 1;
while(1)
{
int sum = 0;
for (i=1; i<=6; i++){
scanf("%d",&a[i]);
if(a[i]!=0 && a[i]%6==0) a[i] = 6;
else a[i] = a[i]%6;
sum += a[i]*i;
}
if (sum==0) break;
printf("Collection #%d:\n", iCase++);
if(sum%2) {
printf("Can't be divided.\n\n");
continue;
}
DP(sum);
}
return 0;
}
zoj1025
#include <stdio.h>
#include <math.h>
#define LN10 2.30258509299405
void Solved(char binary[])
{
int i;
unsigned char low, high;
int expo;
double mant;
unsigned short floating;
floating = 0;
for(i = 0; i < 16; i++)
{
floating = (floating<<1);
if(binary[i] == '1') floating++;
}
low = floating & 0x00FF;
high = floating>>8;
if(floating == 0x8000 || floating == 0)
printf(" 0.000000e+000\n");
else
{
if((floating & 0x8000) != 0) printf("-");
else printf(" ");
mant = (1+low/256.0)*pow(2.0, (high&0x7F)-63);
expo = floor(log(mant)/LN10);
mant = mant/pow(10.0, expo);
printf("%.6lfe", mant);
if(expo>=0) printf("+");
else
{
printf("-");
expo = -expo;
}
printf("%03d\n", expo);
}
}
int main()
{
char binary[20];
printf("Program 6 by team X\n");
while (scanf("%s", binary)!=EOF)
Solved(binary);
printf("End of program 6 by team X\n");
return 0;
}