有1时,所有大于等于1的数都可由1组成。没有1时,最小不幸的数就是1.
1 #include2 #include 3 #include 4 using namespace std; 5 void solve(){ 6 int n,x; 7 scanf("%d",&n); 8 int flag = 0; 9 for(int i = 1; i<=n; i++){10 scanf("%d",&x);11 if(x == 1) flag = 1;12 }13 if(flag) printf("-1\n");14 else printf("1\n");15 }16 int main()17 {18 solve();19 return 0;20 }
神之队友,八个if条件秒A,orz...
最后给的两个矩形每个长和宽翻过来倒过去,有四种情况。再和给的第一个矩形匹配总共有八种情况。
1 #include2 #include 3 #include 4 using namespace std; 5 void solve(){ 6 int a1,b1,a2,b2,a3,b3; 7 cin>>a1>>b1>>a2>>b2>>a3>>b3; 8 int flag = 0; 9 if(a2+a3<=a1 && max(b2,b3)<=b1) flag = 1;10 if(a2+a3<=b1 && max(b2,b3)<=a1) flag = 1;11 if(a2+b3<=a1 && max(b2,a3)<=b1) flag = 1;12 if(a2+b3<=b1 && max(b2,a3)<=a1) flag = 1;13 if(b2+a3<=a1 && max(a2,b3)<=b1) flag = 1;14 if(b2+a3<=b1 && max(a2,b3)<=a1) flag = 1;15 if(b2+b3<=a1 && max(a2,a3)<=b1) flag = 1;16 if(b2+b3<=b1 && max(a2,a3)<=a1) flag = 1;17 if(flag) printf("YES\n");18 else printf("NO\n");19 }20 int main()21 {22 solve();23 return 0;24 }
题意:给定每一个字母出现的个数ai,组成一个最长的字母串.
此字母串满足的条件:
1.其中的每个字母出现的总次数不超过ai.
2.每个字母出现的次数必须是不同的。
题解:这个题直接贪心。 从最大值开始,拿第一组样例,2 5 5来说
排序后2 5 5,从最后5开始,找局部最优解。
1 #include2 #include 3 #include 4 using namespace std; 5 int a[30]; 6 void solve(){ 7 int n; 8 scanf("%d",&n); 9 for(int i = 0; i =0; i--){14 if(maxn == 0) break;15 if(maxn>=a[i]){16 sum += a[i];17 maxn = a[i] - 1;18 }19 else{20 sum += maxn;21 maxn--;22 }23 } 24 printf("%I64d\n",sum);25 }26 int main()27 {28 solve();29 return 0;30 }
记得寒假做过这道水题,我发现我一见到做过的题就懵了。。。
就把第一个人票数一直和后面最大的比较,如果此人最大的小于后面最大的,他就再得一票,后面最大的那个就减一票,ans+1,排序,直到后面没有比它还大的。数据较小,不会超时,至于司老大说的二分法我还没有领会。
1 #include2 #include 3 #include 4 using namespace std; 5 int a[105]; 6 void solve(){ 7 int n,ans = 0; 8 scanf("%d",&n); 9 for(int i = 0; i
我想说这个题寒假也做过……
题意:对于每个人,他都想找到能和他组成最大力量的人匹配。
题解:所以从大到小排序后,我从最大值入手,找到后取出标记,再继续找下一个未被标记且最大的值,贪心思想。
1 #include2 #include 3 #include 4 using namespace std; 5 const int maxn = 805; 6 int cnt[maxn][maxn]; 7 int flag[maxn],ans[maxn]; 8 struct node{ 9 int x,y,v;10 }arr[maxn*maxn];11 bool cmp(node A,node B){12 return A.v>B.v;13 }14 void solve(){15 int n;16 scanf("%d",&n);17 int k = 0;18 for(int i = 2; i<=n*2; i++){19 for(int j = 1; j
老柴一眼看出来这是道dfs题,可惜没时间做了。。。
题解:首先记录每个点的度数方便找到叶子节点。通过记录路上连续的猫的个数,判断是否走该点,然后继续遍历。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 typedef long long ll; 7 const int maxn = 1e5+5; 8 vector path[maxn]; 9 int cat[maxn],leaf[maxn];10 int vis[maxn];11 int n,m,num = 0;12 void dfs(int u,int numcat){13 if(vis[u]) return;14 else vis[u] = 1;15 if(cat[u]) numcat++;16 else numcat = 0;17 if(numcat>m) return;//判断猫的数量是否超过m18 if(leaf[u] == 1&&u != 1) num++;//记录方案数19 for(int i = 0; i
找规律题目,这么多if else写的我醉醉的。。。
1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 void solve(){ 7 int n,i = 0,j = 0,k = 0; 8 scanf("%d",&n); 9 getchar();10 char c;11 for(int p = 0; p = 1 && j == 0 && k == 0) puts("B");18 else if(i == 0 && j >= 1 && k == 0) puts("G");19 else if(i == 0 && j == 0 && k >= 1) puts("R");20 else if(i == 1 && j == 1 && k == 0) puts("R");21 else if(i == 1 && j == 0 && k == 1) puts("G");22 else if(i == 0 && j == 1 && k == 1) puts("B");23 else if(i > 1 && j == 1 && k == 0) puts("GR");24 else if(i > 1 && j == 0 && k == 1) puts("GR");25 else if(i == 1 && j > 1 && k == 0) puts("BR");26 else if(i == 1 && j == 0 && k > 1) puts("BG");27 else if(i == 0 && j > 1 && k == 1) puts("BR");28 else if(i == 0 && j == 1 && k > 1) puts("BG");29 else puts("BGR");30 }31 int main()32 {33 solve();34 return 0;35 }
我还想说这个题寒假也做过。。。
唯一分解定理。即 : n = p1^e1* p2^e2 * p3^e3* … * pr^er;其中p为质数。
注意数据范围,所有素数乘起来便没有平方。
1 #include2 #include 3 #include 4 using namespace std; 5 typedef long long ll; 6 ll p[100]; 7 void solve(){ 8 ll n; 9 scanf("%I64d",&n);10 int ans = 0;11 for(ll i = 2; i*i<=n; i++){12 if(n%i == 0){13 p[ans++] = i;14 while(n%i == 0){15 n /= i;16 }17 }18 }19 if(n>1) p[ans++] = n;20 ll sum = 1;21 for(int i = 0; i
I 和 G两个题还没看,未完待续。。。