A、U131732 Woft6c看两任摸鱼王抢咸鱼
思路:逻辑思维题,首先可以自己进行模拟,找到规律。但是要注意开long long。
代码:
#include<stdio.h> int main(){ int t; scanf("%d",&t); while(t--){ long long n; scanf("%lld",&n); long long ans=(n-1)/2; printf("%lld\n",ans); } return 0; }
B、U130186 Peterliang学习杨氏矩阵
思路:考察对二维数组,if语句的使用,我们发现数据范围较小,所以使用暴力直接枚举,直接对每列和每行进行枚举,我们用flag来标记,初始化flag为1。如果最后flag为1,表示不符合,否则为符合。
#include<stdio.h> int a[20][20]; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&a[i][j]); } } bool flag=1; //一个标记变量 for(int i=0;i<n;i++){ //对每行进行枚举 for(int j=1;j<n;j++){ if(a[i][j]<=a[i][j-1]){ flag=0; } } } for(int j=0;j<n;j++){ //对每列进行枚举 for(int i=1;i<n;i++){ if(a[i][j]<=a[i-1][j]){ flag=0; } } } if(flag==1) printf("YES\n"); else printf("NO\n"); return 0; }
C、U131913 Peterliang救女神
思路:这题应该是唯一一道涉及算法题的题目了,由于数据较小,所以可以用dp或者dfs,bfs进行求解,新生还看不懂的可以跳过。由于只能往右或者往下走,所以,可以直接进行一个dp,而且我们发现每个位置上的数字比较小,所以可以把-1的位置的数字变为十分大,最后看一下答案的大小即可判断是否能打败怪兽。注意左上角和右下角都可能会有陷阱,这种情况直接输出Sorry。
#include<bits/stdc++.h> #define ll long long #define ull unsigned long long #define pb push_back #define lowbit(x) ((x)&(-x)) #define inf 0x3f3f3f3f #define INF 0x3f3f3f3f3f3f3f3f #define endl "\n" #define MP(x,y) (make_pair(x,y)) #define pii pair<int,int> #define pll pair<long long,long long> using namespace std; int n,a[15][15]; int dp[15][15]; int main(){ scanf("%d",&n); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&a[i][j]); memset(dp,0x3f,sizeof(dp)); if(a[0][0]!=-1) dp[0][0] = a[0][0]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==0 && j==0) continue; if(a[i][j]==-1) continue; if(i>0) dp[i][j] = min(dp[i][j],dp[i-1][j]+a[i][j]); if(j>0) dp[i][j] = min(dp[i][j],dp[i][j-1]+a[i][j]); } } if(dp[n-1][n-1]==inf) puts("Sorry"); else printf("%d\n",dp[n-1][n-1]); }
后面加了爆搜的写法
#include<bits/stdc++.h> using namespace std; typedef long long ll; int a[12][12]; int n; int mi=0x3f; void dfs(int x,int y,int sum){ if(a[x][y]==-1) return; if(x>n||y>n) return; if(x==n&&y==n){ mi=min(mi,sum); return; } dfs(x+1,y,sum+a[x+1][y]); dfs(x,y+1,sum+a[x][y+1]); } void solve(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; } } if(a[1][1]==-1||a[n][n]==-1) cout<<"Sorry"<<endl; else{ dfs(1,1,a[1][1]); if(mi>=0x3f) cout<<"Sorry"<<endl; else cout<<mi<<endl; } } int main(){ solve(); return 0; }
D、U131840 Aaryn和Woft6c的字符串出现次数
思路:这个由于数据范围很小,所以可以直接进行一个处理,用一个数组num来记录26个小写字符的个数,然后找出最大的那个,最后按顺序遍历一下26个字符的个数,如果是等于最大就输出。所以不会排序也没有关系。不过可能同学们对于字符串的输入输出还不了解,所以看着办吧。所以多学多接触!!!
#include<bits/stdc++.h> using namespace std; int data[50]; int main() { int n,maxn; scanf("%d",&n); while(n--) { memset(data,0,sizeof(data)); string x; cin>>x; maxn=0; int num=x.length(); for(int i=0;i<num;i++) { data[x[i]-'a']++; maxn=max(maxn,data[x[i]-'a']); } for(int i=0;i<26;i++) { if(data[i]==maxn) printf("%c",i+'a'); } printf("\n"); } return 0; }
E、U131705 Peterliang的时间复杂度
思路:这个思路其实很简单,由于是在同一天,我们可以以00:00:00为起始点,然后计算两个时间距离这个时刻的时间,最后去两者之间的差值即可。
代码:
#include<stdio.h> int main(){ int t; scanf("%d",&t); while(t--){ int h1,h2,m1,m2,t1,t2; scanf("%d%d%d",&h1,&m1,&t1); scanf("%d%d%d",&h2,&m2,&t2); int sum1=h1*3600+m1*60+t1; int sum2=h2*3600+m2*60+t2; int ans=sum1-sum2; if(sum1>sum2) printf("%d\n",ans); else printf("%d\n",-ans); } return 0; }
F、U131906 相信我!这题很难!!!
签到题
#include<stdio.h> int main(){ printf("I love NCU\n"); printf("I love ACM\n"); return 0; }