全标题
Problem ID | Title | |
Y | 2410 Problem A | 百分比 |
Y | 1636 Problem B | 测量风力 |
Y | 1505 Problem C | 最接近的偶数(Append Code) |
Y | 1705 Problem D | 收入支出的和 |
Y | 2561 Problem E | 直角三角形 |
Y | 1422 Problem F | 两两相加和的最大值 |
1310 Problem G | 一共多少天 | |
Y | 1303 Problem H | 方程组的解数 |
1630 Problem I | 测验 | |
Y | 1631 Problem J | 全排列 |
1936 Problem K | 选举总统 | |
2219 Problem L | 数组的平滑 |
summary:
前五道题很简单(虽然有小坑),第六道题也不难但是不用数组只用两个变量在考场上不是很好想 ,进
1. 百分比 2410有除数
注意分母为0的情况 以及这道题目是明确说了先输入n后输入m的
#include <stdio.h>
#include <stdlib.h>
//Problem A: 百分比
//Time Limit: 1 Sec Memory Limit: 16 MB
//Submit: 6257 Solved: 4402
//[Submit][Status]
//Description
//求m占n的百分比,精确到小数点后4位。
//Input
//输入两个整数n和m。
//Output
//以百分比的形式输出m/n,精确到小数点后4位。
//Sample Input
//3 5
//Sample Output
//166.6667%
//HINT
//用%%可以输出“%”。
int main()
{
int n,m;
scanf("%d %d",&n,&m);
if(m==0 || n==0)
printf("0.0000%%");
else
{
double c=m*1.0/n;
printf("%.4f%%",c*100);
}
return 0;
}
2.1636 测量风力
#include <stdio.h>
#include <stdlib.h>
//Problem B: 测量风力
//Time Limit: 1 Sec Memory Limit: 128 MB
//Submit: 6183 Solved: 3179
//[Submit][Status]
//Description
//下面的表格是用于测量风力的蒲福风力等级的简化版本
//-----------------------------------------------------------------------------
// 速率(海里/小时) 描述
//-----------------------------------------------------------------------------
// 小于1 Calm(无风)
// 1~3 Light air(轻风)
// 4~27 Breeze(微风)
// 28~47 Gale(大风)
// 48~63 Storm(暴风)
// 大于63 Hurricane(飓风)
//-----------------------------------------------------------------------------
//编写一个程序,要求用户输入风速(海里/小时), 然后显示相应的描述。
//-----------------------------------------------------------------------------
//Input
//输入一个大于等于0的整型数据N,该数据表示1个速率值(海里/小时) 。
//Output
//输出这个数据N所对应的英文描述,不必输出描述的括号及中文部分。
//
//Sample Input
//2
//Sample Output
//Light air
//HINT
int main()
{
int n;
scanf("%d",&n);
if(n==0)
printf("Calm\n");
else if(n>=1 && n<=3)
printf("Light air\n");
else if(n>=4 && n<=27)
printf("Breeze\n");
else if(n>=28 && n<=47)
printf("Gale\n");
else if(n>=48 && n<=63)
printf("Storm\n");
else if(n>63)
printf("Hurricane\n");
return 0;
}
3.1505 最接近的偶数
#include <stdio.h>
#include <stdlib.h>
//Problem C: 最接近的偶数(Append Code)
//Time Limit: 1 Sec Memory Limit: 128 MB
//Submit: 3280 Solved: 1458
//[Submit][Status]
//Description
//编写一个函数:
//
//int nearest(int n);
//
//用于求不大于n的最大偶数,并作为函数的返回值进行返回。
//
//Input
//是一个int范围内的整数n。
//
//Output
//输出不大于n的最大偶数。
//
//Sample Input
//5
//Sample Output
//4
//HINT
//Append Code
int nearest(int n)
{
if(n%2==0)
return n;
else
return n-1;
}
int main()
{
int m,n;
scanf("%d",&m);
n = nearest(m);
printf("%d",n);
return 0;
}
4.1705 收入支出的和
#include <stdio.h>
#include <stdlib.h>
//简单记帐时用收入记为正数,支出记为负数,现在要求出收入总和和支出总和。
//首先输入n(n>=0),然后输入n个整数。正数为收入,负数为支出。
//输出两个整数,分别是收入与支出的总和。
//5
//100 20 -50 200 -400
//Sample Output
//320 -450
int main()
{
int sumz=0,sumf=0;
int n;
scanf("%d",&n);
int m=0;
while(n>0)
{
n--;
scanf("%d",&m);
if(m>0)
sumz+=m;
else
sumf+=m;
}
printf("%d %d",sumz,sumf);
return 0;
}
5.2561 打印直角三角形
#include <stdio.h>
#include <stdlib.h>
//输入一个正整数N,输出一个N行“+”组成的直角三角形。
//
//Input
//一个正整数N。
//
//Output
//一个N行“+”组成的直角三角形,直角边在左边和下面。
//
//Sample Input
//5
//Sample Output
//+
//++
//+++
//++++
//+++++
//HINT
int main()
{
int n;
scanf("%d",&n);
int i;
int j;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
printf("+");
}
printf("\n");
}
return 0;
}
6.1422 两两相加和的最大值
注意maxsum的初始值设置 以及这道题其实不用数组
#include <stdio.h>
#include <stdlib.h>
//对于输入的N个数a1,a2,a3,...,aN,
//分别求ai+ai+1(i=1,2,...,N-1)和,
//输出其中和最大的两个数及其和。
//
//Input
//输入只有一行。
//第一个整数N>1表示后面有N个整数。
//之后会有N个整数,他们两两之和均不超出int类型的表示范围。
//所有输入的整数两两之间用空格隔开。
//
//Output
//输出只有一行,格式为:
//
//x + y = z
//
//其中x和y是和最大的两个数,z是x和y的和。
//
//如果有多个解,则输出自左边起的第一对数及其和。
//
//Sample Input
//10 1 2 3 4 5 6 7 8 9 10
//Sample Output
//9 + 10 = 19
//HINT
//Append Code
int main()
{
int a,b;
int n,i;
scanf("%d",&n);
scanf("%d",&a);//输入第一个数
int maxa=a,maxb=0;
int maxsum=-100000;//这里maxsum的初始值是关键 如果输入中有负数,,,
for(i=1;i<n;i++)
{
scanf("%d",&b);//输入第二个数
int c=a+b;
if(c>maxsum)
{
maxsum=c;
maxa=a;
maxb=b;
}
a=b;
}
printf("%d + %d = %d\n",maxa,maxb,maxsum);
//printf("%d + %d = %d\n",t,a,c);
return 0;
}
7.1310 一共多少天
8.1303 方程组的解数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//最大的问题是(a,b)与(b,a)算一组还是两组?
//由测试用例可知算作一组 所以要去除重复影响
//找测试用例是先射击在画靶 先随便找个ab然后把mn确定下来
int main()
{
int m,n;
int i,j;
int cnt=0;//不要忘记清零
while(scanf("%d %d",&m,&n)!=EOF)
{
cnt=0;
for(i=0;i<=sqrt(m);i++)
{
for(j=0;j<=sqrt(n);j++)
{
if((i*i+j)==m && (j*j+i)==n)
{
cnt++;
// printf("%d %d\n",i,j);
}
}
}
printf("%d\n",cnt);
}
return 0;
}
9.1630 测验
10.1631 全排列
//gpt第二次
#include <stdio.h>
#define MOD 1000000007
// 计算阶乘模
int quanpailie(int n) {
int ret = 1;
int i;
for (i = 1; i <= n; i++) {
ret = (1LL * ret * i) % MOD; // 确保不溢出
}
return ret;
}
int main() {
int n;
// 输入直到 EOF
while (scanf("%d", &n) != EOF) {
int s[1001] = {0};
int i;
for (i = 0; i < n; i++) {
scanf("%d", &s[i]);
}
int sum = 0;
int used[1001] = {0}; // 记录是否已使用的数字
for (i = 0; i < n; i++) {
int cnt = 0;
int j;
for (j = 1; j < s[i]; j++) { // 统计比 s[i] 小且未使用的数字
if (!used[j]) {
cnt++;
}
}
sum = (sum + 1LL * cnt * quanpailie(n - i - 1) % MOD) % MOD;
used[s[i]] = 1; // 标记当前数字已使用
}
printf("%d\n", (sum + 1) % MOD); // 输出排名
}
return 0;
}
gpt第一次 一半通过率
gpt的思路和我一样 不过它计算的是比当前排序小的所有顺序个数
//
//#include <stdio.h>
//
//#define MOD 1000000007
//
计算阶乘模
//int quanpailie(int n) {
// int ret = 1;
// int i=0;
// for (i = 1; i <= n; i++) {
// ret = (ret * i) % MOD;
// }
// return ret;
//}
//
//int main() {
// int n;
//
// // 输入直到 EOF
// while (scanf("%d", &n) != EOF) {
// int s[1001] = {0};
// int i=0;
// for (i = 0; i < n; i++) {
// scanf("%d", &s[i]);
// }
//
// int sum = 0;
// int used[1001] = {0}; // 记录是否已使用的数字
//
// for ( i = 0; i < n; i++) {
// int cnt = 0;
// int j;
// for ( j = 1; j < s[i]; j++) { // 统计比 s[i] 小且未使用的数字
// if (!used[j]) {
// cnt++;
// }
// }
// sum = (sum + cnt * quanpailie(n - i - 1)) % MOD;
// used[s[i]] = 1; // 标记当前数字已使用
// }
//
// printf("%d\n", (sum + 1) % MOD); // 输出排名
// }
//
// return 0;
//}
我的代码(原始):
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//Description
//小K周末参加了一个娱乐活动。
//在这个活动中,主持人选出n个人,并将这些人从1到n编号,让他们组成一个排列。
//如果按字典序来排列,这n个人的排列是第几个?结果可能很大,
//你只需要输出模1000000007的结果就OK了。
//For example
//1 2 3 -> 1
//1 3 2 -> 2
//2 1 3 -> 3
//2 3 1 -> 4
//3 1 2 -> 5
//3 2 1 -> 6
//
//Input
//多组数据
//每组第一行输入一个整数n(0<n<=1000)
//每组第二行输入一个1——n的排列
//
//Output
//每组输出一行,包含一个正整数,
//表示排列的顺序数模1000000007的结果
//
//Sample Input
//3
//1 2 3
//Sample Output
//1
#define MOD 1000000007
//其实不用把所有排列顺序都找出来
//一个全排列函数
int quanpailie(int n)
{
int ret=n;
int i;
for(i=n-1;i>1;i--)//比较重要的是这个for循环的处理方式
{
ret=(ret*i)%MOD;//这里每次都要取模
}
return ret;
}
// //用来测试全排列函数是否正确运行
//int main()
//{
// int a=0;
// int n=0;
// scanf("%d",&n);
// a=quanpailie(n);
// printf("%d",a);
// return 0;
// }
int main()
{
int n;
scanf("%d",&n);
while(scanf("%d",&n)!=EOF)
{
int s[1001]={0};
int i;
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
int sum=0;
int j;
for(i=0;i<n;i++)
{
int cnt=0;
for(j=i+1;j<n;j++)//我这里算的是比现在排序大的排序
{
if(s[j]>s[i])
{
cnt++;
printf("%d %d\n",s[i],s[j]);
}
}
int c=quanpailie(n-i-1);
// printf("n-i-1=%d %d\n",n-i-1,c);
sum+=cnt*c;
}
int d=quanpailie(n);//全排列的所有可能减去比现在排序大的可能就是现在排序的位置
// printf("%d\n",d);
printf("%d\n",d-sum);
}
return 0;
}
提交上去出现了一个 Output Limit Exceed//超出输出限制
几个关键问题:
1.mod要用在哪里?
2.怎么计算当前顺序在字典序里的位置?
3.如何防止数据溢出?