模拟一场,这场题目算是比较巧的.
a. 很简单的暴力题
b. 有点麻烦的题, 用一堆数字拼成一个最大的能被2,3,5 同时整除的数, 首先必须最后一位数字必须是0, 然后数字的总和要能被三整除 。
解法是枚举一个到两个数字,看减少这些数字能不能使数字的总和被3整除。 如果没有就输出-1
#include#include #include #include using namespace std;int mark[10];int main(){ int n; scanf("%d",&n); int sum=0; for(int i=0;i 0;i--) { for(int j=mark[i];j>0;j--) { flag=1; printf("%d",i); } } if(flag==0) printf("0"); else { for(int i=0;i 0;i--) { for(int j=mark[i];j>0;j--) { flag=1; printf("%d",i); } } if(flag==0) printf("0"); else { for(int i=0;i 0;i--) { for(int j=mark[i];j>0;j--) { flag=1; printf("%d",i); } } if(flag==0) printf("0"); else { for(int i=0;i
3. 第三题很是巧妙, 也很值得一学。
题目的关键在于,边的权值 。 1->2 ,2->3 ,3->1 的权都是1,而 2->1, 3->2, 1->3 的权都为2. 由这个特殊的性质,就可以发现沿着1->2->3->1的路线走始终是最小的 因为假设你在1 你要去3 , 你可以选择1->2->3 也可以1-> 3 这两种路线花费是相同的. 而如果要去2的话1->2 就比2->1 花费要小.
所以问题就变得很简单了.
#include#include #include #include using namespace std;#define N 220struct node{ int to,next,w;}edge[N*N];int n;int cnt,pre[N];int mark[N],sign[N];int in[N];int save[N];int mi;int sum;void add_edge(int u,int v,int w){ edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=pre[u]; pre[u]=cnt++;}void dfs(int s,int k){ for(int ii=0;ii