这次是我这组出题......我出的是B、C、D【虽然本来是想出的很难......╮(╯▽╰)╭但是,没找到AC1000+同时又让我想出的难题......SO...我出的真的不难= =】,荆红出的是A,从此不再出的是D......
A.
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 7 class Node 8 { 9 public: 10 int x,y; 11 }a[1010]; 12 13 bool comp(Node w,Node q) 14 { 15 if(w.x==q.x) 16 return w.y>q.y; 17 return w.x>q.x; 18 } 19 20 int main() 21 { 22 int t,number,b[1010],i,j,n; 23 scanf("%d",&t); 24 while(t--) 25 { 26 scanf("%d",&n); 27 memset(a,0,sizeof(a)); 28 for(i=0;i<n;i++) 29 scanf("%d",&a[i].y); 30 for(i=0;i<n;i++) 31 scanf("%d",&a[i].x); 32 sort(a,a+n,comp); 33 number=0; 34 memset(b,0,sizeof(b)); 35 for(i=0;i<n;i++) 36 { 37 for(j=a[i].y;j>0;j--) 38 if(b[j]==0) 39 { 40 b[j]=1; 41 break; 42 } 43 if(j==0) 44 number+=a[i].x; 45 } 46 printf("%d\n",number); 47 } 48 return 0; 49 }
sum=1+2+3+4+...+i
当sum==s时,直接输出i;
当上一步无法做到时,则当第一次达到(sum-s)%2==0时,输出i即可~
证明【第二步,即此时sum达不到s,且sum>s】:
res=sum-s;
其实仔细想一想~很容易知道当改变sum里的+号时,sum永远是减去一个偶数【why?比如把sum中j前的加号改为减号,就是相当于sum-j-j,会减去2*j】~
SO~若res为奇数,无论如何改变sum中的加号,res永远都无法为0;只有res为偶数时,才有机会通过改变sum中的加号为0。因此当sum无法恰好达到s时,那么第一次达到res%2==0的i就是所求值~~~
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int s,sum,i,res; while(~scanf("%d",&s)) { sum=0; res=0; for(i=1;;i++) { sum+=i; res=sum-s; if(sum==s) break; if(res>0 && res%2==0) break; } printf("%d\n",i); } return 0; }
//memory:164KB time:0ms
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 #define N 1010 5 #define INF 2000000000 6 7 using namespace std; 8 9 int map[N][N],lowcost[N],visited[N],d[N],p[N]; 10 11 12 void dijkstra(int s,int n) 13 { 14 memset(visited,false,sizeof(visited)); 15 int i,j,k,min; 16 for(i=1;i<=n;i++) 17 { 18 lowcost[i]=map[s][i]; 19 } 20 d[s]=0; 21 visited[s]=true; 22 for(i=1;i<n;i++) 23 { 24 min=INF; 25 for(j=1;j<=n;j++) 26 { 27 if(!visited[j]&&min>lowcost[j]) 28 { 29 min=lowcost[j]; 30 k=j; 31 } 32 } 33 d[k]=min; 34 visited[k]=true; 35 for(j=1;j<=n;j++) 36 { 37 if(!visited[j]&&lowcost[j]>map[k][j]+d[k]) 38 lowcost[j]=map[k][j]+d[k]; 39 } 40 } 41 } 42 43 int DFS(int s,int n) 44 { 45 if(p[s]) return p[s]; 46 if(s==2) return 1; 47 int i,sum=0; 48 for(i=1;i<=n;i++) 49 { 50 if(map[s][i]<INF&&d[s]>d[i]) 51 { 52 if(p[i]) sum=sum+p[i]; 53 else sum=sum+DFS(i,n); 54 } 55 } 56 sum=sum+p[s]; 57 p[s]=sum; 58 return p[s]; 59 } 60 61 int main() 62 { 63 int i,j,n,m,u,v,w; 64 while(cin>>n&&n) 65 { 66 cin>>m; 67 memset(p,0,sizeof(p)); 68 for(i=1;i<=n;i++) 69 { 70 for(j=1;j<=n;j++) 71 { 72 map[i][j]=(i==j?0:INF); 73 } 74 } 75 for(i=0;i<m;i++) 76 { 77 scanf("%d%d%d",&u,&v,&w); 78 map[u][v]=map[v][u]=w; 79 } 80 dijkstra(2,n); 81 cout<<DFS(1,n)<<endl; 82 } 83 return 0; 84 }
//memory:4276KB time:78ms