thinkDifferent思维糖果

求n个数是否满足给定的平均数、最大值、最小值

小蜗蜗有 n 个数字(实数),但他不知道这些数字具体是啥。

他只知道这 n 个数字的最大值、最小值和平均值,但也不一定是对的。

现在,小蜗蜗想知道,存不存在一种方案,使得这 n 个数字的最大值、最小值和平均值恰好等于给定值。
#include <bits/stdc++.h>		
using namespace std;
int main(){
	int t;
	cin>>t;
	int n,maxx,minx,ave;
	while(t--){//
	cin>>n>>maxx>>minx>>ave;
//	if(maxx<minx||ave<minx||ave>maxx){
//	printf("no\n");
//	continue;
//	}
//	if(n==1){
//		if(maxx==minx&&maxx==ave)printf("yes\n");
//		else printf("no\n");
//	}
//	else if(n==2){
//		if((maxx+minx)/2==ave)printf("yes\n");
//		else printf("no\n");
//	}
//	else{
//		if(n*ave-minx-maxx>=minx*(n-2)&&n*ave-minx-maxx<=maxx*(n-2))printf("yes\n");
//		else printf("no\n");
//	}
	int min=(n-1)*minx+maxx;
	int max=(n-1)*maxx+minx;
	if(maxx<minx||ave<minx||ave>maxx){
	printf("no\n");
	continue;
	}
	if(n*ave>=min&&n*ave<=max){
		printf("yes\n");
	}
	else printf("no\n");
	}

    return 0;
}

有多少个ordinary number

#include <bits/stdc++.h>		
using namespace std;
int main(){
	int t;
	cin>>t;
	int n;
	while(t--){
		cin>>n;
		int cnt=0;
		int x1;
		int b=0;//n有多少位 9*(b-1)
			int flag=1;
			int x=n%10;
			int k=n;
			while(n){
//				if(n%10<=x)x=n%10;//1234  8849 9876 6789 6798
//				else flag=0;//不一定要6543,只要每一位不小于最高位就行 
				if(n/10==0)x1=n%10;//最高位 
				n/=10;
				b++;
			}
			while(k){
					if(n%10<x1)falg=0;//1234  8849 9876 6789 6798
			}
			cnt+=9*(b-1);
			if(flag)cnt+=x1;
			else cnt+=(x1-1);
		cout<<cnt<<endl;
	}
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main(){   
int t;
cin>>t;
    while(t--){
        int n,w=-1,cs=1;
        cin>>n;
        int n1=n;
         while(n1){
             w++;
             n1/=10;
             if(w){
			 cs*=10;
             cs++;//这种方法是除以1111(n有多少位除以多少位) 
			 }
         }
        printf("%d\n",w*9+n/cs);
    }
}

来了来了,不仅超时中途还陷入了死循环的错误,哭哭哭~

#include <bits/stdc++.h>		
using namespace std;
int main(){
	int t;
	cin>>t;
	int n;
	while(t--){
		cin>>n;
		int cnt=0;
		for(int i=1;i<=n;i++){
//			if(i/10==0)cnt++;
//			while((i/10)!=0){//88 89 100 12 11
//			cout<<"niew "<<i;
//				int x=(i/10)%10;
//				if(i%10==x)i=i/10;
//				else {
//					break;
//				}
//			}
			int k=i;
			int x=k%10;
			while(k!=0){//6
		
				if(k%10==x)	{
					k=k/10;
				}
				else break;
			}
			if(k==0)cnt++;
		}
		cout<<cnt<<endl;
	}
    return 0;
}

Most Unstable Array

在这里插入图片描述
在这里插入图片描述
题意:构造一个序列,让两两元素之差的绝对值之和最大。
思维水题:我们可以发现对于如果
当n = 1时,没有绝对值的差a n s = 0,
当n = 2的时候,我们只能化成0 , n 的形式,a n s = n,
当n ≥ 3 时,最大值就是2 ∗ n 了,因为可以化成 0 , n ,
0, n, 0 , n ,0…的形式

#include <bits/stdc++.h>
using namespace std;
int main(){   
	int t;
	cin>>t;
	int n,sum;
	while(t--){
		cin>>n>>sum;
		if(n==1)printf("0\n");
		else if(n==2)printf("%d\n",sum);
		else{
			printf("%d\n",2*sum);
		}
	} 
}

这题要求数列中每个数都是non—negative integer非负整数
就有点像之前一道题,要构造一个序列,使得这个序列累加之和为sum。,序列之中的数满足是整数就行,结果就是,sum,sum-1,-(sum-1) ,sum-2,-(sum-1)……1,-1,0

对整数n删除多少位能让25整除n

#include <bits/stdc++.h>		
using namespace std;
int main(){
	int t;
	cin>>t;
	int n;
	while(t--){
	cin>>n;
	int cnt=0;
	//可以先判断if(n%25==0)噢,省下一些时间,当然不提前判断也许行 
	int flag0=0;//找到了最后两位中的那个0,还要找个0或者5 
	int flag5=0;//找到了最后两位中的那个5,还要找个2或者7
	while(n){
//		int x=n%10;
//		if(x==0&&!flag0)flag0=1;
//		else if(x==5&&!flag5)flag5=1;
//		else if(x==0||x==5&&flag0)break;
//		else if(x==2||x==7&&flag5)break;
//		else{
//			cnt++;
//		} 
//		n/=10;
//这种对于每个数字起初态度都是留下的做法不可以,比如50555,留下了最后一个5,走着走着
//就会让你悔不当初,还是狠一点,一开始就否掉它,走到成立的那一步再捞回来 
		cnt++;
		int x=n%10;
//	 	if(x==0&&!flag0)flag0=1;
//		else if(x==5&&!flag5)flag5=1;
//榆木脑袋怎么可以放在前面呢,flag标志一设,那么单单一个0或2、5、7就过关了呀 
		if((x==0||x==5)&&flag0){
//!!!||和 && 优先级可不像你想的那样相同 然后按照先后顺序判断,会先判断&&噢 !!! 
			cnt-=2;//捞回这两个可以放在末尾的数 
			break;
		}
		else if((x==2||x==7)&&flag5){
			cnt-=2; 
			break;
		}
		if(x==0&&!flag0)flag0=1;
		else if(x==5&&!flag5)flag5=1;
		n/=10;
	}
	cout<<cnt<<endl;
	}
    return 0;
}

冒泡排序最糟糕情况 n*(n-1)/2

Attention!Be sensitive!
Cubes Sorting

#include <bits/stdc++.h>		
using namespace std;
const int N=1e5+5;
typedef long long int ll;
ll a[N];
int main(){
	int t;
	scanf("%d",&t);
	int n;
	while(t--){
		int cnt=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%d",a+i);
		}
//		for(int j=n-1;j>=0;j--){
//		for(int i=0;i<j;i++){
//		if(a[i]>a[i+1]){
//			cnt++;
//		swap(a[i],a[i+1]);
//	} 	
//	}
//}
//真正具体实现冒泡排序,双重循环碰上e5必定超时,此时考虑最坏情况,
//该序列完全倒序,那么冒牌排序需要交换n*(n-1)/2次(要对这个值敏感一点 ! 
//那么只需要看是否完全倒序,只要不是完全倒序,交换次数就会小于n*(n-1)/2 
int sum=0;
 for(int i=0;i<n-1;i++){
 	if(a[i]>a[i+1])sum++;//sum最终等于n-1那么说明完全倒序 
 } 
if(sum==n-1)printf("NO\n");
else printf("YES\n");
	} 
    return 0;
}

Trouble Sort

#include <bits/stdc++.h>		
using namespace std;
const int N=1001;
//int a[N][2];
struct kkk{
	int a,b;
}c[N];
//bool cmp(kkk c1,kkk c2){
//	return c1.a<c2.a;
//}
//bool is_sorted()这种简单的方法还是不要指望库函数啦,自己写一个很快哒a[i]<a[i+1],flag 
//kkk c1[N];
int main(){
	int t;
	cin>>t;
	int n;
	while(t--){
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>c[i].a;
		}
		for(int i=0;i<n;i++){
			cin>>c[i].b;
		}
//		for(int j=n-1;j>=0;j--){
//		for(int i=0;i<j;i++){
//		if(c[i].a>c[i+1].a&&c[i].b!=c[i+1].b){
//		swap(c[i],c[i+1]);
//	} 	
//	}
//}
//不管是cubeSort还是TroubleSort,这种思维题都不是冲着让你排序去的,所以不用
//那么老实地去实现
//思维在此:两个元素b不同才能进行交换。
//情况一:数组元素的b全部相同,那原序列无序就NO,有序则Yes
//情况二: 数组元素的b有的为0,有的为1,那么任意两元素必然可以实现交换呀
//即便b值相同,可以把与他俩b值不相同的第三个元素作为中介temp对他俩进行交换 
	int flag=1;//检测到有无序的就置为0
	int p=0,q=0;//分别记录0和1 是否出现过 
	for(int i=0;i<n-1;i++){		//10 20 20 30
		if(c[i].a>c[i+1].a){//最后non-decreasing 升序 
			flag=0; 
		}
		if(c[i].b)q=1;//1出现过啦 
		if(c[i].b==0)p=1;//0出现过啦 
	}
	//Attention! 注意下标啦,不要忽略 n-1
		if(c[n-1].b)q=1;//1出现过啦 
		if(c[n-1].b==0)p=1;//0出现过啦 
		if(flag)printf("Yes\n");
		else if(p&&q)printf("Yes\n");
		else printf("No\n");
}
    return 0;
}

已知多边形各顶点坐标,求该多边形的面积

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值