1331 是否可达、keda
#include <stdio.h>
#include <string.h>
#define MAX 1000
struct Node{
int v,net;
};
struct Node node[MAX];
int main(){
int n,e,t,i,x,y,z,head[MAX],que[MAX],map[MAX/2][MAX/2],qh,qt;
while(scanf("%d %d",&n,&e)!=EOF){
memset(head,-1,sizeof(head));
for(i = 0;i < e;i++){
scanf("%d %d",&x,&y);
node[i].v = y;
node[i].net = head[x];
head[x] = i;
}
scanf("%d",&t);
while(t--){
z = 0;
memset(map,0,sizeof(map));
qh = qt = 1;
scanf("%d %d",&x,&y);
if(x == y){
printf("yes\n");
continue;
}
que[qt++] = x;
while(qh < qt){
for(i = head[que[qh]];i != -1;i = node[i].net){
if(map[que[qh]][node[i].v] == 0){
map[que[qh]][node[i].v] = 1;
que[qt++] = node[i].v;
}
if(node[i].v == y){
z = 1;
break;
}
}
if(z == 1) break;
qh++;
}
if(z == 1) printf("yes\n");
else printf("no\n");
}
printf("\n");
}
return 0;
}
1351 二分查找、erfen
#include <stdio.h>
#define MAX 200000
int a[MAX],b[MAX];
void search(int x,int len){
int low = 0,high = len-1;
while(low <= high){
int mid = (low + high)/2;
if(a[mid] == x){
printf("%d\n",mid);
return;
}else if(a[mid] > x){
high = mid - 1;
}else{
low = mid + 1;
}
}
printf("Not Found\n");
}
int main(){
int M,N,i;
scanf("%d",&M);
getchar();
for(i = 0;i < M;i++){
scanf("%d",&a[i]);
}
scanf("%d",&N);
for(i = 0;i < N;i++){
scanf("%d",&b[i]);
}
for(i = 0;i < N;i++){
search(b[i],M);
}
return 0;
}
1360 快速排序、kuaipai
#include <stdio.h>
#define MAX 100000
int a[MAX],n;
void show(){
for(int i = 0;i < n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
void quicksort(int begin,int end){
if(begin < end){
int root = a[begin];
int m = begin,n = end;
while(m < n){
while(m < n){
if(a[n] < root){
a[m] = a[n];
break;
}else{
n--;
}
}
while(m < n){
if(a[m] > root){
a[n] = a[m];
break;
}else{
m++;
}
}
}
a[m] = root;
show();
quicksort(begin,m-1);
quicksort(n+1,end);
}
}
int main(){
scanf("%d",&n);
getchar();
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
}
quicksort(0,n-1);
return 0;
}
1503 捕牛记、puniu
#include<stdio.h>
#include<string.h>
int v[1000000],p[1000000],s[1000000];
int main(){
int n,m,h,t;
while(scanf("%d%d",&n,&m)!=EOF&&n!=-1){
h=0,t=1;
memset(v,0,sizeof(v));
memset(p,0,sizeof(v));
memset(s,0,sizeof(v));
v[n]=1,p[t]=n;
while(h<t){
h++;
if(p[h]==m){
printf("%d\n",s[h]);
break;
}
if(v[p[h]-1]==0&&p[h]-1>=0)
t++,p[t]=p[h]-1,s[t]=s[h]+1,v[p[h]-1]=1;
if(v[p[h]+1]==0&&p[h]+1<=100000)
t++,p[t]=p[h]+1,s[t]=s[h]+1,v[p[h]+1]=1;
if(v[2*p[h]]==0&&2*p[h]<=100000)
t++,p[t]=2*p[h],s[t]=s[h]+1,v[2*p[h]]=1;
}
}
return 0;
}
1567 中位数、zhongwei
#include <stdio.h>
#define MAX 1000000
int n;
int a[MAX],b[MAX];
int main(){
scanf("%d",&n);
getchar();
for(int i = 0;i < n;i++){
scanf("%d",&a[i]);
}
for(int i = 0;i < n;i++){
scanf("%d",&b[i]);
}
int i=0,j=0,goal;
while(n--){
if(a[i] >= b[j]){
goal = b[j++];
}else{
goal = a[i++];
}
}
printf("%d\n",goal);
return 0;
}
1901 最长公共子序列、zuichang
#include <stdio.h>
#include <string.h>
#define MAX 1001
char str1[MAX],str2[MAX];
int dp[MAX][MAX];
void cal(){
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = len1 > len2 ? len1 :len2;
for(int i = 1;i <= len;i++){
dp[0][i] = 0;
dp[i][0] = 0;
}
for(int i = 1;i <= len1;i++){
for(int j = 1;j <= len2;j++){
if(str1[i-1] == str2[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}else{
dp[i][j] = dp[i-1][j] > dp[i][j-1]? dp[i-1][j]:dp[i][j-1];
}
}
}
printf("%d\n",dp[len1][len2]);
}
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--){
gets(str1);
gets(str2);
cal();
}
}
1923 符号三角形问题、sanjiao
#include <stdio.h>
#define MAX 26
int n,c,sum,half,p[MAX][MAX];
void Cal(int t){
if(t > n){
sum++;
}else{
int i,j;
for(i = 0;i < 2;++i){
p[1][t] = i;
c += i;
for(j = 2;j <= t;++j){
p[j][t-j+1] = p[j-1][t-j+1]^p[j-1][t-j+2];
c += p[j][t-j+1];
}
if(c <= half&&((t+1)*t/2-c) <= half){
Cal(t+1);
}
c -= i;
for(j = 2;j <= t;++j){
c -= p[j][t-j+1];
}
}
}
}
int main(){
int T,t=1;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
c = 0;
sum = 0;
half = (n+1)*n/2;
if(half%2==0){
half/=2;
Cal(1);
}
printf("Case %d: %d\n",t++,sum);
}
return 0;
}
1924 n后问题、nhou
#include <stdio.h>
#include <stdlib.h>
#define MAX 15
int n,sum,x[MAX];
int place(int k){
if(k == 1) return 1;
for(int i = 1;i < k;i++){
if((abs(k-i)==abs(x[k]-x[i]))||(x[k]==x[i])) return 0;
}
return 1;
}
void backtrack(int t){
if(t > n){
sum++;
}else{
for(int i = 1;i <= n;i++){
x[t] = i;
if(place(t)) backtrack(t+1);
}
}
}
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--){
sum = 0;
scanf("%d",&n);
backtrack(1);
printf("%d\n",sum);
}
return 0;
}
1925 最大团、tuan
#include <stdio.h>
#include <stdlib.h>
struct Node{
int **a,*x,*bestx;
int n,cn,bestn;
};
void cal(struct Node *node,int i){
int j,flag = 1;
if(i > node->n){
for(j = 1;j <= node->n;j++){
node->bestx[j] = node->x[j];
}
node->bestn = node->cn;
return;
}
for(j = 1;j < i;j++){
if(node->x[j] == 1&&node->a[i][j] == 0){
flag = 0;
break;
}
}
if(flag){
node->x[i] = 1;
node->cn++;
cal(node,i+1);
node->cn--;
}
if(node->n + node->cn - i >= node->bestn){
node->x[i] = 0;
cal(node,i+1);
}
}
int main(){
int T,t = 1,i,n,m,x,y;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
int *v = (int *)malloc(sizeof(int)*(n+1));
int *temp = (int *)malloc(sizeof(int)*(n+1));
int **a = (int **)malloc(sizeof(int *)*(n+1));
for(i = 0;i <= n;i++){
a[i] = (int *)calloc(sizeof(int),n+1);
}
for(i = 1;i <= m;i++){
scanf("%d %d",&x,&y);
a[x][y] = 1;
a[y][x] = 1;
}
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->a = a;
node->x = temp;
node->bestx = v;
node->n = n;
node->cn = 0;
node->bestn = 0;
cal(node,1);
printf("Case %d: %d\n",t++,node->bestn);
}
return 0;
}
1927 旅行售货员问题、lvxing
#include<iostream>
#define N 100
using namespace std;
int n,m,w,
graph[N][N],
c=0,
bestc=-1,
x[N],
bestx[N];
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void backtrack(int k) {
if(k==n) {
if( (c+graph[x[n-1]][x[n]]+graph[x[n]][1]<bestc||bestc==-1) && graph[x[n-1]][x[n]]!=-1 && graph[x[n]][1]!=-1 ) {
bestc=c+graph[x[n-1]][x[n]]+graph[x[n]][1];
for(int i=1;i<=n;i++) {
bestx[i]=x[i];
}
}
return ;
}
else {
for(int i=k;i<=n;i++) {
if( graph[x[k-1]][x[i]]!=-1 && (c+graph[x[k-1]][x[i]]<bestc || bestc==-1)) {
swap(x[i],x[k]);
c+=graph[x[k-1]][x[k]];
backtrack(k+1);
c-=graph[x[k-1]][x[k]];
swap(x[i],x[k]);
}
}
}
}
int main(void) {
int i,j,tmp=1,testNum;
cin>>testNum;
while(tmp<=testNum){
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
graph[i][j]=-1;
for(int k=1;k<=m;k++){
cin>>i>>j>>w;
graph[i][j]=w;
graph[j][i]=w;
}
for(i=1;i<=n;i++) {
x[i]=i;
bestx[i]=i;
}
backtrack(2);
cout<<"Case "<<tmp<<": "<<bestc<<endl;
bestc=-1;
c=0;
tmp++;
}
return 0;
}
1930 主元素、zhu
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100001
int n,x,t[MAX];
int m2(){
int i = rand()%n+1;
x = t[i];
int k;
for(int j = 1;j <= n;j++){
if(t[j]==x) k++;
}
if(k > n/2) return 1;
else return 0;
}
int m1(){
int l = 100;
while(l--){
if(m2()) return 1;
else return m2();
}
}
int main(){
int T,i;
srand((int)time(0));
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(i = 1;i <= n;i++){
scanf("%d",&t[i]);
}
if(m1()) printf("%d\n",x);
else printf("no\n");
}
return 0;
}
1940 用DFS计算pre和post、jisuan
#include <stdio.h>
#include <stdlib.h>
struct Node{
int flag,v,pre,post;
struct Node *next;
};
int clock;
struct Node node[1001];
void explore(int i){
if(node[i].flag == -1) return;
node[i].flag = -1;
node[i].pre = clock++;
struct Node *temp = &node[i];
while(temp->next){
if(temp->next->flag ==1) explore(temp->next->v);
temp = temp->next;
}
node[i].post = clock++;
}
void DFS(int v_count){
for(int i = 1;i <= v_count;i++){
if(node[i].flag == 1){
explore(node[i].v);
}
}
}
int main(){
int v_count,line_count,v_head,v_target;
while(scanf("%d",&v_count)!=EOF){
clock = 1;
scanf("%d",&line_count);
for(int i = 1;i <= v_count;i++){
node[i].flag = 1;
node[i].next = NULL;
node[i].v = i;
}
for(int i = 1;i <= line_count;i++){
scanf("%d %d",&v_head,&v_target);
struct Node *temp = &node[v_head];
struct Node *temp_next = temp->next;
while(temp_next != NULL&&temp_next->v<v_target){
temp = temp_next;
temp_next = temp_next->next;
}
if(temp_next == NULL){
struct Node *n = (struct Node *)malloc(sizeof(struct Node));
n->flag = 1;
n->v = v_target;
n->next = NULL;
temp->next = n;
}else{
struct Node *n = (struct Node *)malloc(sizeof(struct Node));
n->flag = 1;
n->v = v_target;
n->next = temp_next;
temp->next = n;
}
}
DFS(v_count);
for(int i = 1;i <= v_count;i++){
printf("%d ",node[i].pre);
}
printf("\n");
for(int i = 1;i <= v_count;i++){
printf("%d ",node[i].post);
}
printf("\n");
}
}
1941 强连通分量、qiangliantong
#include<stdio.h>
#include<string.h>
int G[1001][1001];
int cG[1001][1001];
int v[1001];
int visited[1001];
int n, e;
struct stack{
int data[1001];
int top;
} s;
void cDFS(int k);
void DFS(int k);
int count;
int main(){
int i, j, k;
scanf("%d %d",&n,&e);
for(i=1;i<=n;i++){
v[i] = i;
visited[i] = 0;
}
for(k=1;k<=e;k++){
scanf("%d %d",&i,&j);
G[i][j] = 1;
cG[j][i] = 1;
}
s.top = -1;
for(i=1;i<=n;i++)
if(!visited[i]){
cDFS(i);
s.top++;
s.data[s.top] = v[i];
}
i =0;
while(s.top!=-1){
i++;
v[i] = s.data[s.top];
s.top--;
}
count = 0;
memset(visited,0,sizeof(visited));
for(i=1;i<=n;i++)
if(!visited[v[i]]){
count++;
DFS(v[i]);
}
printf("%d",count);
}
void cDFS(int k){
int i;
visited[k] = 1;
for(i=1;i<=n;i++){
if(!visited[i] && cG[k][i]==1){
cDFS(i);
s.top++;
s.data[s.top] = v[i];
}
}
}
void DFS(int k){
int i;
visited[k] = 1;
for(i=1;i<=n;i++){
if(!visited[i] && G[k][i]==1)
DFS(i);
}
}
1943 多重背包、duozhong
#include <stdio.h>
#define N 100
#define C 10000
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,c,w[N+1],v[N+1],m[N+1],i,j,k = 0,t,f[C]={0};
scanf("%d %d",&n,&c);
for(i = 1;i <= n;i++){
scanf("%d %d %d",&w[i],&v[i],&m[i]);
t = 1;
if(m[i] > 1){
while(m[i] > t){
k++;
w[n+k] = w[i]*t;
v[n+k] = v[i]*t;
m[n+k] = 1;
m[i]-=t;
t*=2;
}
w[i]*=m[i];
v[i]*=m[i];
m[i] = 1;
}
}
for(i = 1;i <= n+k;i++){
if(m[i] == 1){
for(j = c;j >= w[i];j--){
f[j] = f[j] > f[j-w[i]]+v[i] ? f[j] : f[j-w[i]]+v[i];
}
}else{
for(j = w[i];j <= c;j++){
f[j] = f[j] > f[j-w[i]]+v[i] ? f[j] : f[j-w[i]]+v[i];
}
}
}
printf("%d\n",f[c]);
}
return 0;
}
1945 二维背包、erwei
#include <stdio.h>
#define MAX 1000
int T,i,j,k,max,N,C,L,v[MAX],w[MAX],p[MAX],f[MAX][MAX];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d %d",&N,&C,&L);
for(i = 1;i <= N;i++){
scanf("%d %d %d",&v[i],&w[i],&p[i]);
}
for(i = 0;i <= L;i++){
for(j = 0;j <= C;j++){
f[i][j] = 0;
}
}
for(i = 1;i <= N;i++){
for(j = L;j >= w[i];j--){
for(k = C;k >= v[i];k--){
max = f[j][k];
if(max < f[j-w[i]][k-v[i]]+p[i]){
max = f[j-w[i]][k-v[i]]+p[i];
}
f[j][k]=max;
}
}
}
printf("%d\n",f[L][C]);
}
return 0;
}
1946 分组背包、fenzu
#include <stdio.h>
#define MAX 1000
int T,max,i,j,k,N,C,num[MAX],v[MAX][MAX],p[MAX][MAX],f[MAX];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d %d",&N,&C);
for(i = 1;i <= N;i++){
scanf("%d",&num[i]);
for(j = 1;j <= num[i];j++){
scanf("%d %d",&v[i][j],&p[i][j]);
}
}
for(i = 0;i <= C;i++){
f[i] = 0;
}
for(i = 1;i <= N;i++){
for(j = C;j >= 0;j--){
for(k = 1;k <= num[i];k++){
if(j >= v[i][k]){
max = f[j];
if(max < f[j-v[i][k]]+p[i][k]){
max = f[j-v[i][k]]+p[i][k];
}
f[j] = max;
}
}
}
}
printf("%d\n",f[C]);
}
return 0;
}
1948 最大子矩阵和、zuida
#include <stdio.h>
#define MAX 400
int main(){
int i,j,k,temp,max,m,n,flag,map[MAX][MAX];
while(scanf("%d %d",&m,&n)!=EOF){
flag = 0;
for(i = 0;i < m;i++){
for(j = 0;j < n;j++){
scanf("%d",&map[i][j]);
}
for(k = 0;k < i;k++){
for(j = 0;j < n;j++){
map[k][j] += map[i][j];
}
}
for(k = 0;k <= i;k++){
for(j = n-1;j >= 0;j--){
if(j == n-1) max = map[k][j];
else max = map[k][j] > (map[k][j] + max) ? map[k][j] : (map[k][j] + max);
if(flag == 0){
temp = max;
flag = 1;
}else{
temp = temp > max ? temp : max;
}
}
}
}
printf("%d\n",temp);
}
return 0;
}
2005 输油管道、shuyou
#include <stdio.h>
#include <math.h>
#include <algorithm>
#define MAX 10000
using namespace std;
int cmp(int x, int y){
return x < y;
}
int main(){
int n,x,y,b[MAX]={0};
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d %d",&x,&y);
b[i] = y;
}
sort(b,b+n,cmp);
int c = b[n/2];
int res = 0;
for(int i = 0;i < n;i++){
res += abs( c - b[i]);
}
printf("%d\n",res);
}
2028 租用游艇问题、youting
#include <stdio.h>
#define MAX 201
int money[MAX][MAX];
void cal(int n){
int i,j = n,k,h = n-1;
for(i = n-2;i >= 1;i--){
for(k = h;k <= n-1;k++){
if(money[i][j]>(money[i][k]+money[k][j])){
money[i][j] = money[i][k]+money[k][j];
}
}
h--;
}
printf("%d\n",money[1][n]);
}
int main(){
int n,i,j,k = 2;
scanf("%d",&n);
for(i = 1;i <= n-1;i++){
for(j = k;j <= n;j++){
scanf("%d",&money[i][j]);
}
k++;
}
cal(n);
return 0;
}
2060 子集和问题
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[7000];
bool book[7000];
int b[7000];
int n,c;
int flag;
int mark;
void dfs(int step,int sum)
{
if(step==n)
{
if(sum<c)
mark=1;
return ;
}
if(mark)
return ;
if(a[step]>c)
return ;
if(sum>c)
return ;
if(flag)
return ;
int i;
if(sum==c)
{
flag=1;
for(i=0;i<step-1;i++)
printf("%d ",b[i]);
printf("%d \n",b[i]);
return ;
}
for(i=0;i<n;i++)
{
if(book[i]==0)
{
book[i]=1;
b[step]=a[i];
dfs(step+1,sum+a[i]);
book[i]=0;
}
}
}
int main(void)
{
while(scanf("%d%d",&n,&c)!=EOF)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
memset(book,0,sizeof(book));
sort(a,a+n);
flag=0;
mark=0;
if(a[0]>c)
{
printf("No Solution!\n");
continue ;
}
dfs(0,0);
if(flag==0||mark==1)
printf("No Solution!\n");
}
return 0;
}